【问题标题】:Why "RUN rm /etc/nginx/conf.d/default.conf" did not succeed?为什么“RUN rm /etc/nginx/conf.d/default.conf”没有成功?
【发布时间】:2018-04-20 22:47:26
【问题描述】:

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

令我惊讶的是,它不起作用。 /etc/nginx/conf.d/default.conf 还在。

为什么以及如何删除它?

我的码头文件:

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 服务添加了一个名字 volumn

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

更新:

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

更新2:

有了第二个答案,我终于弄清楚了原因。所以RUN rm /etc/nginx/conf.d/default.conf 确实有效。问题是我在运行RUN rm /etc/nginx/conf.d/default.conf 之前创建的docker-compose.yml 中使用了一个卷,并且该卷具有default.conf。

事情是这样的,我先用了一个不带rm的dockerfile并运行docker-compose up,然后我添加了rm重建镜像并再次运行docker-compose up。但我从不更改我的 docker-compose.yml 或清理我的音量。所以无论我如何构建/重建我的图像,文件都在那里。

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

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

【问题讨论】:

  • 如果您尝试使用自定义的conf 文件运行nginxhttps://hub.docker.com/_/nginx/ 中有一个部分会告诉您如何正确操作。
  • 谢谢。但是我只是想摆脱/etc/nginx/conf.d/default.conf,我在hub.docker.com/_/nginx中没有找到如何做到这一点
  • 我很抱歉,但这一点都不清楚。官方的 nginx 镜像有 default.conf 文件,无论你从哪个操作系统运行它都没有关系。我怀疑您没有推送您对注册表中的图像所做的更改。
  • 我很确定我推送了它并且文件仍然存在。这就是为什么我首先问这个问题
  • 我尝试在 AWS ECS 和 Azure 上推送图像。结果相同。你可以发布你的 Dockerfile 吗? docker-compose 文件也会有所帮助

标签: docker nginx dockerfile


【解决方案1】:

我认为您没有使用新图像。

我通过简单地创建一个新的 Dockerfile 来测试它:

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

【讨论】:

  • 一种方法是使用COPY nginx.conf /etc/nginx/conf.d/default.conf
【解决方案2】:

卷是对文件系统的运行时更改。构建在没有您创建映像的卷的情况下运行。因此,该文件在映像中被删除,但随后您在包含该文件的容器中安装了一个卷。

解决方法是不使用卷,以便您可以看到映像中存在的文件系统,或者您可以从卷中删除文件。以下应该适用于从卷中清除文件:

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

【讨论】:

  • 您好,“您在包含该文件的容器中安装了一个卷”,但哪个容器有该文件?因为我已经为 nginx 容器删除了。
  • @Qiulang 您从 nginx 映像中删除了文件(构建时),而不是从外部挂载并替换该目录位置(运行时)映像中的任何内容的容器卷中删除。
  • 那是我不明白的过去!您可以在我的 dockerfile 中看到,我不仅删除了 default.conf,还添加了一个文件 node2,当我运行我的 nginx 映像时,我发现 default.conf 和 node2 都在那里,所以它不是“替换图像中的任何内容”在那个目录位置”。当您说“不是来自外部安装的容器卷”时,您正在谈论哪个容器?
  • 哪个容器?你得告诉我,我看不到你的屏幕。请使用您的输出更新您的问题,或者从卷中删除文件或完全删除卷(如上所示),检查容器以及目录容器内的 ls,以便我们可以进一步提供帮助。
  • 有了您的意见,我终于弄清楚了原因(请参阅我的更新)。所以我会接受你的回答。
猜你喜欢
  • 2018-08-15
  • 1970-01-01
  • 1970-01-01
  • 2014-04-04
  • 1970-01-01
  • 2016-02-08
  • 1970-01-01
  • 1970-01-01
  • 2019-11-14
相关资源
最近更新 更多