例如,我使用nginx
容器,然后进入该容器以更改其配置。然后我停止并启动它以使其重新加载,但它立即关闭。
例如,日志给我:
nginx: [emerg] unknown log format "upstream_time" in /etc/nginx/conf.d/main.conf:17
现在我知道如何修复它,但是我必须访问此容器,才能访问它,该容器必须正在运行。
我如何强制docker使用docker start
命令(而不是docker run
)启动容器并强制其存活?
您可以将文件复制到本地主机,然后编辑它:
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
命令以使其再次运行。
这样的卷装载非常适合推入配置文件。您可以在/var/log
或类似位置装载空目录,以取出日志文件。他们需要保留所有需要在容器运行期间保留的数据。对于nginx,调用静态HTML / JS / CSS / ...内容就足够了,您需要提供“数据”并以这种方式注入它。