如何在Azure上的Linux虚拟机中设置Docker容器开机自启
Docker容器开机自启配置失效原因及修复方案
失效原因
- 脚本存储路径错误:
/tmp是Linux系统的临时挂载目录,系统重启后所有内容会被自动清空,你放在该目录下的startup_script.sh开机后已经不存在,自然无法执行。 - systemd服务依赖配置错误:你配置的
After=default.target不符合需求,Docker容器启动需要依赖Docker服务和网络就绪,你设置的启动时机可能早于Docker、网络初始化完成,导致Docker命令执行失败。 - 脚本本身存在语法问题:
- 脚本没有添加shebang声明(
#!/bin/bash),系统无法识别脚本的执行环境 - 你写的
docker run命令换行时没有加反斜杠\,会被系统识别为两条独立命令直接报错 - systemd服务默认以root身份运行,脚本里加
sudo属于冗余操作,部分环境下反而会触发权限校验问题
- 脚本没有添加shebang声明(
- 容器启动逻辑问题:每次执行
docker run都会新建一个容器,如果上次重启前容器没有被删除,再次执行会因为8787端口被占用、容器名冲突等问题启动失败。
修复方案
方案一:修复现有systemd配置
- 移动脚本到持久化目录
执行以下命令将脚本移动到/usr/local/bin(系统级可执行文件存放目录,重启不会丢失):
mv /tmp/startup_script.sh /usr/local/bin/ chmod +x /usr/local/bin/startup_script.sh
- 修改脚本内容
将/usr/local/bin/startup_script.sh内容修改为以下格式,注意换行加反斜杠,优先启动已有容器避免重复新建:
#!/bin/bash # 私有ACR请提前用root身份执行docker login myacr.azurecr.io完成认证 CONTAINER_NAME="rstudio_server" if [ $(docker ps -a --filter "name=$CONTAINER_NAME" -q | wc -l) -eq 0 ]; then docker run -d --name $CONTAINER_NAME --restart=on-failure \ -p 8787:8787 -e USER=rstudio \ -e PASSWORD=mypassword myacr.azurecr.io/mycontainer else docker start $CONTAINER_NAME fi
- 修改systemd服务配置
将/etc/systemd/system/run-at-startup.service内容修改为:
[Unit] Description=Run Rstudio Docker container at startup After=network.target docker.service Requires=docker.service [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/local/bin/startup_script.sh TimeoutStartSec=0 [Install] WantedBy=multi-user.target
- 重载配置并启用服务
systemctl daemon-reload systemctl enable run-at-startup.service
重启后可执行以下命令排查运行状态:
# 查看服务运行状态 systemctl status run-at-startup.service # 查看服务运行日志 journalctl -u run-at-startup.service -f
方案二:更简单的Docker原生自启方案
无需编写systemd服务,直接在第一次运行容器时添加--restart=always参数,Docker服务启动时会自动拉起设置了重启策略的容器:
# 私有ACR请提前完成登录认证 docker run -d --restart=always -p 8787:8787 -e USER=rstudio \ -e PASSWORD=mypassword myacr.azurecr.io/mycontainer
配置后只需保证Docker服务本身是开机自启的(大多数Azure Linux镜像默认已开启,如未开启执行systemctl enable docker即可)。
内容的提问来源于stack exchange,提问作者Enrico
相关产品推荐
相关产品推荐

