背景
我有一个 Dockerfile,用于创建一个包含 Apache Web 服务器的镜像。然而,我还希望使用 Dockerfile 构建我的网站,这样构建过程就不会依赖于开发者的本地环境。请注意,Docker 容器仅用于本地开发,而不是生产环境。
问题
我有以下 Dockerfile:
FROM httpd
RUN apt-get update -yq
RUN apt-get -yq install curl gnupg
RUN curl -sL https://deb.nodesource.com/setup_12.x | bash
RUN apt-get update -yq
RUN apt-get install -yq \
dh-autoreconf=19 \
ruby=1:2.5.* \
ruby-dev=1:2.5.* \
nodejs
我来构建它:
sudo docker build --no-cache .
构建成功,以下是部分输出内容:
Step 9/15 : RUN curl -sL https://deb.nodesource.com/setup_12.x | bash
---> Running in e6c747221ac0
......
......
......
Removing intermediate container 5a07dd0b1e01
---> 6279003c1e80
Successfully built 6279003c1e80
然而,当我使用以下命令在容器中运行该镜像时:
sudo docker container run --rm -it --name=debug 6279003c1e80 /bin/bash
然后,在容器内执行apt-cache policy
时,它不会显示应该已添加的curl命令所在的存储库。同时,运行apt-cache policy nodejs
时显示安装了旧版本。
但是当我在容器内运行以下命令:
curl -sL https://deb.nodesource.com/setup_12.x | bash
apt-cache policy
apt-cache policy nodejs
它向我展示了已添加存储库,以及可用的新版本nodejs。
那么,为什么在docker文件内使用curl命令时似乎无法正常工作,但手动在容器中从shell执行却可以正常工作?如何解决这个问题?
更新
- 请注意,为了防止缓存问题,我正在使用--no-cache标志。
- 我还删除了所有容器并进行了sudo docker system prune,并重新构建了镜像,但没有成功。
- 我尝试将所有内容捆绑在一个RUN命令中,就像用户"hmm"建议的那样(因为这是apt命令的最佳实践):
RUN apt-get update -yq \
&& apt-get -yq install curl gnupg && \
&& curl -sL https://deb.nodesource.com/setup_12.x | bash \
&& apt-get update -yq \
&& apt-get install -yq \
dh-autoreconf=19 \
ruby=1:2.5.* \
ruby-dev=1:2.5.* \
nodejs \
&& rm -rf /var/lib/apt/lists/*
sudo docker build --no-cache .
但仍然遇到同样的问题。即使在一个RUN语句中运行它,我仍然安装了旧的node版本,并且没有添加存储库。 - Stefan--no-cache
。请查看我的编辑,看看它是否可以解决问题。 - chashcurl https://<url> | bash
命令的退出状态实际上是bash
的退出状态(在此情况下为 0)。要由于 curl 的非零退出状态导致管道失败,您需要调整默认 shell 以使用例如bash
并使用set -o pipefail
:SHELL ["/bin/bash", "-o", "pipefail", "-c"]
。 - chash