使用 docker 启动命令时强制容器保持活动状态

Force container to stay alive when using docker start command

例如,我使用 nginx 容器,然后我进入该容器以更改其配置。然后我停止并启动它让它重新加载,但它立即关闭。

例如日志给我:

nginx: [emerg] unknown log format "upstream_time" in /etc/nginx/conf.d/main.conf:17

现在我知道如何修复它了,但是我必须访问这个容器,为了能够访问它,这个容器必须是 运行。

如何使用 docker start 命令(而不是 docker run)强制 docker 启动容器并强制其保持活动状态?

您可以将文件复制到您的本地主机,然后对其进行编辑:

docker cp my_CON:/etc/nginx/conf.d/main.conf .

编辑后重新复制到容器:

docker cp  main.conf my_CON:/etc/nginx/conf.d/main.conf

然后重新开始

一个Docker容器包装了一个进程。如果您执行某些操作导致该进程退出,容器将始终退出,并且没有任何解决办法。

一般来说,您不应该直接编辑容器内的文件。最关键的是,这种方式所做的任何更改都会在删除容器后立即丢失,删除容器是一个非常常规的操作。许多容器也不包含您可以使用的编辑器。

在@LinPy 的回答和@Adiii 的评论之间是最佳做法。如果您还没有现有的配置文件,请先从容器中复制它。

docker cp my_CON:/etc/nginx/conf.d/main.conf .

现在对该文件进行任何需要的编辑。停止并删除现有容器,然后使用作为绑定安装卷推送的修改后的配置文件重新启动它。

docker stop my_CON
docker rm my_CON
docker run \
  --name my_CON \
  -v $PWD/main.conf:/etc/nginx/conf.d/main.conf \
  -p ... \
  nginx:alpine

原则上您可以直接在您的主机上编辑文件,更改将反映在容器中。 (有很多关于这不能可靠工作的 SO 报告。)如果服务器实时重新加载配置并在错误时退出,您可以修复配置并重新 运行 相同的 docker run 命令来获取又 运行ning 了。

像这样的卷挂载非常适合将配置文件推入。您可以在 /var/log 或类似的地方挂载一个空目录以输出日志文件。他们需要保留任何需要跨容器 运行 持久存在的数据。在 nginx 的情况下,调用静态 HTML/JS/CSS/... 您需要提供的内容 "data" 并以这种方式注入它是合理的。