首页 > 解决方案 > 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

标签: dockerdockerfile

解决方案


这听起来像一个错误。

要尝试的事情:

  1. 更新到最新版本的 Docker,看看它是否修复它。
  2. 尝试创建最小的复制器。可能会帮助您捕捉一些东西,但如果您的复制器最少,您可以在https://github.com/moby/moby/issues提交错误,或者找到解决方法。

一种潜在的解决方法是尝试 BuildKit 后端,一种替代构建后端。

  1. 添加# syntax = docker/dockerfile:1.1-experimental到 Dockerfile 的第一行。
  2. export DOCKER_BUILDKIT=1
  3. 运行构建。

推荐阅读