在内部进程崩溃时重新启动 Docker 容器
Restart Docker container on inner process crash
更新:发现秘密原因 - nodemon
答案只是将容器设置为在崩溃时重新启动。在开发中,我正在使用 nodemon 来防止进程在崩溃时退出 - 所以我假设进程崩溃不会导致容器退出。我的错。当使用 node
而不是 nodemon
.
时,进程崩溃实际上会导致容器退出
{
"scripts": {
"development:service": "nodemon ./service/server.js",
"production:service": "node ./service/server.js"
}
}
原问题
当内部容器崩溃时如何重启docker容器?
最好的方法是给容器设置--autorestart ON_FAILURE
,然后在内部进程崩溃时让容器崩溃?如果是这样,我如何在其中一个进程崩溃时强制容器崩溃?
我正在使用图像 node:10.15.3
。
有用Link:how to make a container restart if the container, itself, crashes
Docker 文件
FROM node:10.15.3
ENV NODE_ENV development
# Create application directory.
RUN mkdir -p /src
WORKDIR /src
# Install app dependencies and build.
ADD . /src
RUN yarn install --force
RUN ["chmod", "+x", "./run.sh"]
CMD [ "./run.sh" ]
进程(简化)
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
user 13 0.0 0.1 17952 2840 ? S 15:09 0:00 bash ./install.sh
user 72 0.5 3.2 889668 66728 ? Sl 15:09 0:00 /usr/local/bin/node /opt/yarn-v1.13.0/bin/yarn.js start
user 97 2.4 3.2 919992 65748 ? Sl 15:09 0:01 /usr/local/bin/node ./service/server.js
您可以为 docker 运行 命令使用 --restart 标志
https://docs.docker.com/engine/reference/commandline/run/#restart-policies---restart
示例:
docker run --restart=on-failure my-image-name
或者,如果您使用的是 docker-compose,那么您 restart: on-failure
可以使用该服务
https://docs.docker.com/compose/compose-file/#restart
当你 运行 一个容器中的多个服务,并且你非常非常确定你想要这个(最好的做法是 运行 单个容器中的单个进程),你可能想要进程主管(例如 systemd
),它会重新启动内部任何崩溃的进程,或者如果它的任何受监管进程崩溃则崩溃。
还有一些其他更轻量级的方法来完成此操作,例如包装器 bash 脚本。
都在这里描述了:https://docs.docker.com/config/containers/multi-service_container/
使用 Dockerfile 更新问题后编辑:
最简单的方法可能是确保 run.sh
在其任何子进程崩溃时崩溃。然后容器将崩溃,如果您在 docker run
.
中使用 --restart=on-failure
,则可以选择重新启动
更新:发现秘密原因 - nodemon
答案只是将容器设置为在崩溃时重新启动。在开发中,我正在使用 nodemon 来防止进程在崩溃时退出 - 所以我假设进程崩溃不会导致容器退出。我的错。当使用 node
而不是 nodemon
.
{
"scripts": {
"development:service": "nodemon ./service/server.js",
"production:service": "node ./service/server.js"
}
}
原问题
当内部容器崩溃时如何重启docker容器?
最好的方法是给容器设置--autorestart ON_FAILURE
,然后在内部进程崩溃时让容器崩溃?如果是这样,我如何在其中一个进程崩溃时强制容器崩溃?
我正在使用图像 node:10.15.3
。
有用Link:how to make a container restart if the container, itself, crashes
Docker 文件
FROM node:10.15.3
ENV NODE_ENV development
# Create application directory.
RUN mkdir -p /src
WORKDIR /src
# Install app dependencies and build.
ADD . /src
RUN yarn install --force
RUN ["chmod", "+x", "./run.sh"]
CMD [ "./run.sh" ]
进程(简化)
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
user 13 0.0 0.1 17952 2840 ? S 15:09 0:00 bash ./install.sh
user 72 0.5 3.2 889668 66728 ? Sl 15:09 0:00 /usr/local/bin/node /opt/yarn-v1.13.0/bin/yarn.js start
user 97 2.4 3.2 919992 65748 ? Sl 15:09 0:01 /usr/local/bin/node ./service/server.js
您可以为 docker 运行 命令使用 --restart 标志 https://docs.docker.com/engine/reference/commandline/run/#restart-policies---restart
示例:
docker run --restart=on-failure my-image-name
或者,如果您使用的是 docker-compose,那么您 restart: on-failure
可以使用该服务
https://docs.docker.com/compose/compose-file/#restart
当你 运行 一个容器中的多个服务,并且你非常非常确定你想要这个(最好的做法是 运行 单个容器中的单个进程),你可能想要进程主管(例如 systemd
),它会重新启动内部任何崩溃的进程,或者如果它的任何受监管进程崩溃则崩溃。
还有一些其他更轻量级的方法来完成此操作,例如包装器 bash 脚本。
都在这里描述了:https://docs.docker.com/config/containers/multi-service_container/
使用 Dockerfile 更新问题后编辑:
最简单的方法可能是确保 run.sh
在其任何子进程崩溃时崩溃。然后容器将崩溃,如果您在 docker run
.
--restart=on-failure
,则可以选择重新启动