docker - Dockerfile USER 步骤总是缺少缓存
问题描述
在我的 docker 文件中,这一步永远不会命中缓存并且总是产生新的中间容器:
USER $USERNAME
当运行时docker build --rm=false .
,USER
总是会错过缓存并且总是产生不同的哈希,即使前面的哈希是相同的。
---> b2ee21c9959f
Step 38/55 : USER $USERNAME
---> Running in 6ea8b1f6df65
---> 86640ea527b0
---> b2ee21c9959f
Step 38/55 : USER $USERNAME
---> Running in c9e822b114b0
---> e289bdbf5a1d
我不明白为什么它总是丢失缓存。还有为什么USER
不是幂等的?
编辑:原来 $USERNAME 是空的,因为没有声明 ARG。仍然很奇怪它会错过缓存。
完整输出的差异:https ://www.diffchecker.com/c5Ftyx01
Dockerfile:
ARG METEOR_VERSION=1.10.2
ARG NODE_VERSION=13.11.0
ARG NVM_VERSION=0.35.3
ARG METEOR_PROJECT_PATH=examples/leaderboard
ARG USERNAME=meteor-deploy
ARG GROUPNAME=$USERNAME
ARG PULUMI_PROJECT_NAME
FROM empiricaly/meteor:$METEOR_VERSION as meteor-with-user
SHELL ["/bin/bash", "-c"]
ARG GROUPNAME
RUN groupadd "$GROUPNAME"
ARG USERNAME
ENV HOME "/home/$USERNAME"
RUN useradd -g "$GROUPNAME" -d "$HOME" -ms /bin/bash "$USERNAME"
USER $USERNAME
WORKDIR $HOME
ARG METEOR_VERSION
RUN meteor --release "$METEOR_VERSION" --version
FROM meteor-with-user as meteor-nvm
ENV NVM_DIR "$HOME/.nvm"
ARG NODE_VERSION
RUN mkdir "$NVM_DIR"
# Install nvm with node and npm
ARG NVM_VERSION
RUN curl "https://raw.githubusercontent.com/creationix/nvm/v$NVM_VERSION/install.sh" | bash \
&& . $NVM_DIR/nvm.sh \
&& nvm install $NODE_VERSION \
&& nvm alias default $NODE_VERSION \
&& nvm use default
ENV NODE_PATH $NVM_DIR/v$NODE_VERSION/lib/node_modules
ENV PATH $NVM_DIR/v$NODE_VERSION/bin:$PATH
RUN . $NVM_DIR/nvm.sh && nvm --version
FROM meteor-nvm as meteor-nvm-pulumi
RUN curl -fsSL https://get.pulumi.com | bash
ENV PULUMI_PATH $HOME/.pulumi/bin
ENV PATH $PATH:$PULUMI_PATH
ENV PULUMI_CONFIG_PASSPHRASE meteor-pulumi
RUN pulumi version
FROM meteor-nvm-pulumi as local-meteor-deploy
# XXX --chown doesn't support dynamic arguments, yet.
#COPY --chown=$USERNAME:$GROUPNAME . meteor-deploy
COPY . meteor-deploy
USER root
RUN chown -R "$USERNAME:$GROUPNAME" "$HOME/meteor-deploy"
USER $USERNAME
WORKDIR $HOME/meteor-deploy
RUN . "$NVM_DIR/nvm.sh" && npm install
RUN . "$NVM_DIR/nvm.sh" \
&& npm run build:js \
&& npm link
FROM local-meteor-deploy as meteor-project
WORKDIR $HOME
ARG METEOR_PROJECT_PATH
# XXX --chown doesn't support dynamic arguments, yet.
#ADD --chown=$USERNAME:$GROUPNAME $METEOR_PROJECT_URL meteor-project
ADD $METEOR_PROJECT_PATH meteor-project
USER root
RUN chown -R $USERNAME:$GROUPNAME meteor-project
USER $USERNAME
WORKDIR $HOME/meteor-project
RUN . "$NVM_DIR/nvm.sh" && npm install -D "file://$HOME/meteor-deploy"
ARG PULUMI_PROJECT_NAME
RUN . "$NVM_DIR/nvm.sh" && npx meteor-deploy init $PULUMI_PROJECT_NAME && npm install
RUN pulumi login -l --non-interactive && pulumi stack init dev --non-interactive
FROM meteor-project
RUN . "$NVM_DIR/nvm.sh" && npx meteor-deploy stack configure default
解决方案
这听起来像一个错误。
要尝试的事情:
- 更新到最新版本的 Docker,看看它是否修复它。
- 尝试创建最小的复制器。可能会帮助您捕捉一些东西,但如果您的复制器最少,您可以在https://github.com/moby/moby/issues提交错误,或者找到解决方法。
一种潜在的解决方法是尝试 BuildKit 后端,一种替代构建后端。
- 添加
# syntax = docker/dockerfile:1.1-experimental
到 Dockerfile 的第一行。 export DOCKER_BUILDKIT=1
- 运行构建。
推荐阅读
- mysql - 无法使用 docker 容器连接到 MySQL 数据库
- syntax - 中间人在使用 link_to 块时显示语法错误
- mongodb - MongoDb 两个集合还是一个?
- c++ - 使用 bfs 解决连接组件问题时得到错误答案
- java - Java 无法通过 JPA 连接到 mySQL
- php - 何时调用 woocommerce/wordpress 挂钩?
- javascript - 对失败的承诺使用 then()?
- javascript - 如何在 jQuery 的一系列承诺中强制拒绝承诺
- vb.net - 如何获取 ListView.SubItems
- c++ - 构建跨度
> 从一个数组 >