我正在尝试在Google Compute Engine实例上使用启动脚本:
docker start rstudio
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 run
ning它重新。
这将使脚本的全部内容为:
#!/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
选项将数据存储在容器空间之外。)