来自 systemd 服务的 docker 运行 启动但立即退出并重新启动,但是来自 shell 的 docker 运行 工作正常
docker run from systemd service starts but exits immediately, and restarts, but docker run from shell works fine
在我的 CentOS 7.2 机器上,使用 Docker 1.10.3,我成功测试了以下内容(运行 作为 root):
docker run --name usljavadoc_server -p 80:80 -p 443:443 -v /opt/app/uslJavadoc/:/var/www/html/ -d eboraas/apache
自动部署到“/opt/app/uslJavadoc”的内容可从容器中的 apache 运行 得到服务。
所以,我的下一步是让它与 systemd 一起工作,所以我创建了“/etc/systemd/system/docker-usljavadoc.service”,内容如下:
[Unit]
Description=Apache serving USL Javadoc
Requires=docker.service
After=docker.service
[Service]
TimeoutStartSec=0
Restart=always
ExecStart=/usr/bin/docker run --name usljavadoc_server -p 80:80 -p 443:443 -v /opt/app/uslJavadoc/:/var/www/html/ -d eboraas/apache
ExecStop=/usr/bin/docker stop -t 2 usljavadoc_server
ExecStopPost=/usr/bin/docker rm -f usljavadoc_server
[Install]
WantedBy=default.target
我手动重新加载了systemd并启动了服务。我验证了另一个盒子上的浏览器可以访问 apache 进程并获得正确提供的内容。然后我重新启动以确保它在重新启动时工作。仍然有效。
所以,我以为我完成了。但是,仔细一看发现是服务成功启动了,但是启动后立即退出,然后又重新启动。这是不断发生的。由于它只是提供 html 内容(javadoc 树),并且服务会立即重新启动,用户甚至可能不会注意到有问题,但绝对不应该这样做。
知道为什么这个 "docker run" 在 shell 中运行良好,并且似乎在 systemd 中启动良好,但几秒钟后立即退出吗?
从 运行 命令中删除 -d
选项。
ExecStart=/usr/bin/docker run --name usljavadoc_server -p 80:80 -p 443:443 -v /opt/app/uslJavadoc/:/var/www/html/ eboraas/apache
在docker docs中是这样描述的:
To start a container in detached mode, you use -d=true or just -d
option. By design, containers started in detached mode exit when the
root process used to run the container exits.
在 ExecStart
您的客户端退出后。 Systemd 会将此视为错误并执行您的 ExecStop 命令 + 尝试重新启动 (restart=always
)
在我的 CentOS 7.2 机器上,使用 Docker 1.10.3,我成功测试了以下内容(运行 作为 root):
docker run --name usljavadoc_server -p 80:80 -p 443:443 -v /opt/app/uslJavadoc/:/var/www/html/ -d eboraas/apache
自动部署到“/opt/app/uslJavadoc”的内容可从容器中的 apache 运行 得到服务。
所以,我的下一步是让它与 systemd 一起工作,所以我创建了“/etc/systemd/system/docker-usljavadoc.service”,内容如下:
[Unit]
Description=Apache serving USL Javadoc
Requires=docker.service
After=docker.service
[Service]
TimeoutStartSec=0
Restart=always
ExecStart=/usr/bin/docker run --name usljavadoc_server -p 80:80 -p 443:443 -v /opt/app/uslJavadoc/:/var/www/html/ -d eboraas/apache
ExecStop=/usr/bin/docker stop -t 2 usljavadoc_server
ExecStopPost=/usr/bin/docker rm -f usljavadoc_server
[Install]
WantedBy=default.target
我手动重新加载了systemd并启动了服务。我验证了另一个盒子上的浏览器可以访问 apache 进程并获得正确提供的内容。然后我重新启动以确保它在重新启动时工作。仍然有效。
所以,我以为我完成了。但是,仔细一看发现是服务成功启动了,但是启动后立即退出,然后又重新启动。这是不断发生的。由于它只是提供 html 内容(javadoc 树),并且服务会立即重新启动,用户甚至可能不会注意到有问题,但绝对不应该这样做。
知道为什么这个 "docker run" 在 shell 中运行良好,并且似乎在 systemd 中启动良好,但几秒钟后立即退出吗?
从 运行 命令中删除 -d
选项。
ExecStart=/usr/bin/docker run --name usljavadoc_server -p 80:80 -p 443:443 -v /opt/app/uslJavadoc/:/var/www/html/ eboraas/apache
在docker docs中是这样描述的:
To start a container in detached mode, you use -d=true or just -d option. By design, containers started in detached mode exit when the root process used to run the container exits.
在 ExecStart
您的客户端退出后。 Systemd 会将此视为错误并执行您的 ExecStop 命令 + 尝试重新启动 (restart=always
)