检测docker是否应该在启动时运行或启动容器 - 使用systemd但它会不断传播错误 - 如何停止?

问题描述 投票:0回答:1

我正在尝试在Google Compute Engine实例上使用启动脚本:

  1. 如果名为rstudio的docker容器存在但处于停止状态,请运行docker start rstudio
  2. 如果docker容器不存在,请运行rstudio run --name=rstudio rocker/rstudio

从这个SO我认为这可以通过docker top rstudio || docker run --name=rstudio rocker/rstudio实现,但似乎总是错误在docker top rstudio部分。在那种情况下,我尝试过管道docker top rstudio &>/dev/null但没有效果。

我有一个在实例启动时运行的cloud-config。

我的问题是运行或启动容器的脚本继续注册为错误,并没有继续拉动图像的逻辑。我已经尝试将它放在一个单独的bash脚本中并直接通过ExecStart - 也在ExecStart命令(它应该忽略错误?)前面加上“ - ”但这似乎也没有效果。这是我最终的结果:

#cloud-config

users:
- name: gcer
  uid: 2000

write_files:
- path: /home/gcer/docker-rstudio.sh
  permissions: 0755
  owner: root
  content: |
    #!/bin/bash

    echo "Docker RStudio launch script"
    if ! docker top rstudio &>/dev/null
    then
      echo "Pulling new rstudio"
      docker run -p 80:8787 \
                 -e ROOT=TRUE \
                 -e USER=%s -e PASSWORD=%s \
                  -v /home/gcer:/home/rstudio \
                  --name=rstudio \
                  %s
    else
      echo "Starting existing rstudio"
      docker start rstudio
    fi

- path: /etc/systemd/system/rstudio.service
  permissions: 0644
  owner: root
  content: |
    [Unit]
    Description=RStudio Server
    Requires=docker.service
    After=docker.service

    [Service]
    Restart=always
    Environment="HOME=/home/gcer"
    ExecStartPre=/usr/share/google/dockercfg_update.sh
    ExecStart=-/home/gcer/docker-rstudio.sh
    ExecStop=/usr/bin/docker stop rstudio

runcmd:
- systemctl daemon-reload
- systemctl start rstudio.service

无论我尝试什么,当我运行sudo journalctl -u rstudio.service时,我最终得到这个错误日志

Feb 14 23:26:09 test-9 systemd[1]: Started RStudio Server.
Feb 14 23:26:09 test-9 docker[770]: Error response from daemon: No such container: rstudio
Feb 14 23:26:09 test-9 systemd[1]: rstudio.service: Control process exited, code=exited status=1
Feb 14 23:26:09 test-9 systemd[1]: rstudio.service: Unit entered failed state.
Feb 14 23:26:09 test-9 systemd[1]: rstudio.service: Failed with result 'exit-code'.
Feb 14 23:26:09 test-9 systemd[1]: rstudio.service: Service hold-off time over, scheduling restart.
Feb 14 23:26:09 test-9 systemd[1]: Stopped RStudio Server.
Feb 14 23:26:09 test-9 systemd[1]: Starting RStudio Server...
...
Feb 14 23:26:09 test-9 systemd[1]: Started RStudio Server.
Feb 14 23:26:09 test-9 docker[809]: Error response from daemon: No such container: rstudio
Feb 14 23:26:09 test-9 systemd[1]: rstudio.service: Control process exited, code=exited status=1
Feb 14 23:26:09 test-9 systemd[1]: rstudio.service: Unit entered failed state.
Feb 14 23:26:09 test-9 systemd[1]: rstudio.service: Failed with result 'exit-code'.
Feb 14 23:26:10 test-9 systemd[1]: rstudio.service: Service hold-off time over, scheduling restart.
Feb 14 23:26:10 test-9 systemd[1]: Stopped RStudio Server.
Feb 14 23:26:10 test-9 systemd[1]: rstudio.service: Start request repeated too quickly.
Feb 14 23:26:10 test-9 systemd[1]: Failed to start RStudio Server.
Feb 14 23:26:10 test-9 systemd[1]: rstudio.service: Unit entered failed state.
Feb 14 23:26:10 test-9 systemd[1]: rstudio.service: Failed with result 'exit-code'.

任何人都可以帮我搞定这个吗?

docker rstudio google-compute-engine systemd
1个回答
0
投票

当你停止它时我会删除容器。然后你的启动脚本减少到更加确定容器被删除,并无条件docker running它重新。

这将使脚本的全部内容为:

#!/bin/sh
docker stop rstudio
docker rm rstudio
docker run -p 80:8787 \
   --name=rstudio \
   ... \
   rstudio run --name=rstudio rocker/rstudio

如果没有set -e选项,即使先前的命令失败(因为容器不存在),脚本仍将继续执行docker run命令。这避免了任何试图弄清楚容器是否存在的测试,并且总是让您处于一致状态。

同样,为了更好地清理,我将更改systemd单元文件以在其停止后删除容器

ExecStop=/usr/bin/docker stop rstudio
ExecStopPost=/usr/bin/docker rm rstudio

(您的设置有三种可能的状态:容器正在运行;容器存在但已停止;容器不存在。我的设置删除了“存在但已停止”状态,该状态没有很多值,尤其是因为您使用docker run -v选项将数据存储在容器空间之外。)

© www.soinside.com 2019 - 2024. All rights reserved.