我试图在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
,但没有效果。
我有一个当实例启动时运行的云配置。
我的问题是,要运行或启动容器的脚本一直注册为错误,并且没有继续拖放图像的逻辑。我尝试过将它放在单独的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'.
有人能帮我把这事做好吗?
发布于 2019-02-15 02:27:07
当你停下来的时候我会删除这个容器。然后,您的启动脚本简化为额外确保容器被删除,并无条件地重新对其进行docker run
处理。
这将使脚本的全部内容如下:
#!/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
选项将数据存储在容器空间之外。)
https://stackoverflow.com/questions/54700773
复制相似问题