为什么“RUN rm /etc/nginx/conf.d/default.conf”没有成功?

我不想让我的nginx /etc/nginx/conf.d/default.conf镜像拥有/etc/nginx/conf.d/default.conf所以我写了一个简单的nginx dockerfile,主要是添加RUN rm /etc/nginx/conf.d/default.conf

令我惊讶的是,这没有奏效。 /etc/nginx/conf.d/default.conf仍然存在。

为什么以及如何删除它?

我的dockerfile:

 FROM nginx:latest # Copy custom configuration file from the current directory RUN rm /etc/nginx/conf.d/default.conf COPY nginx.conf /etc/nginx/nginx.conf COPY conf.d/node2 /etc/nginx/conf.d/node2 EXPOSE 80 8080 

我的docker-compose.yml为nginx服务添加了名称卷

 volumes: - conf:/etc/nginx/conf.d 

更新:

我终于发现,这是因为我在我的docker-compose.yml中创build了一个名为volume的名称,它创build/etc/nginx/conf.d/default.conf因此/etc/nginx/conf.d/default.conf rm根本不起作用。 但是为什么创build名称卷将导致创build`/etc/nginx/conf.d/default.conf?

UPDATE2:

随着第二个答案,我终于明白了为什么。 所以RUN rm /etc/nginx/conf.d/default.conf确实有效。 问题是我在运行RUN rm /etc/nginx/conf.d/default.conf之前创build的docker-compose.yml中使用了一个卷,并且该卷有default.conf。

发生了这样的情况,我第一次使用没有rm的dockerfile并运行docker docker-compose up ,然后我添加了rm来重build镜像并再次运行docker-compose up 。 但我永远不会更改我的docker-compose.yml或清理我的卷。 所以无论我如何构build/重build我的图像,文件都在那里。

我删除了所有旧的卷(使用docker卷rm docker volume ls -q -f dangling=true )后终于工作。

我在这里留下我的问题,而不是删除它,以防万一别人可能会像我一样犯同样的错误:$

卷是文件系统的运行时间更改。 构build运行没有你的音量来创build图像。 因此,该文件在映像中被删除,但是您在装有该文件的容器中安装一个卷。

修复方法是不使用卷,以便可以查看映像中存在的文件系统,也可以从卷中删除该文件。 以下内容适用于清理卷中的文件:

 docker run -it --rm -v ${vol_name}:/target busybox rm /target/default.conf 

我不认为你正在使用你的新形象。

我通过简单地创build一个新的Dockerfile来testing它:

 FROM nginx:alpine RUN rm /etc/nginx/conf.d/default.conf 

我已经执行了下面的命令:

 docker build -t test-nginx . docker run -it --name mynginx-instance test-nginx ls -la /etc/nginx/conf.d docker rm mynginx-instance