Docker镜像不在不同构建之间缓存

时间:2018-03-02 17:01:36

标签: docker

我似乎无法理解为什么这些构建不会缓存?

第一次构建:

Step 1/12 : ARG CUSTOM_NODE_VERSION
Step 2/12 : FROM node:$CUSTOM_NODE_VERSION
 ---> 672002a50a0b
Step 3/12 : ARG BUILD_TOKEN
 ---> Using cache
 ---> d76a52dccfd9
Step 4/12 : RUN apt-get update &&     apt-get install -y locales &&     sed --in-place '/en_US.UTF-8/s/^# //' /etc/locale.gen &&     locale-gen &&     echo "export LANG=en_US.UTF-8" >> /etc/profile &&     echo "export TZ=UTC" >> /etc/profile
 ---> Running in 2903bfda5367

第二次构建:

Step 1/12 : ARG CUSTOM_NODE_VERSION
Step 2/12 : FROM node:$CUSTOM_NODE_VERSION
 ---> 672002a50a0b
Step 3/12 : ARG BUILD_TOKEN
 ---> Using cache
 ---> d76a52dccfd9
Step 4/12 : RUN apt-get update &&     apt-get install -y locales &&     sed --in-place '/en_US.UTF-8/s/^# //' /etc/locale.gen &&     locale-gen &&     echo "export LANG=en_US.UTF-8" >> /etc/profile &&     echo "export TZ=UTC" >> /etc/profile
 ---> Running in c76a33c7599f

BUILD_ARG在每个版本中都有所不同。这是什么导致它不缓存?他们每次都使用相同的跑步者。除此之外,一切都是一样的。

Afaiac,它正在使用BUILD_ARG的缓存。

Dockerfile的第一部分:

ARG CUSTOM_NODE_VERSION

FROM node:$CUSTOM_NODE_VERSION

ARG BUILD_TOKEN

# Set locale
RUN apt-get update && \
    apt-get install -y locales && \
    # Generate needed locale
    sed --in-place '/en_US.UTF-8/s/^# //' /etc/locale.gen && \
    locale-gen && \
    # Set system locale (add line)
    echo "export LANG=en_US.UTF-8" >> /etc/profile && \
    # Set system timezone (add line)
    echo "export TZ=UTC" >> /etc/profile

    # Install git
RUN apt-get install -y git
...

1 个答案:

答案 0 :(得分:0)

docker构建是分层的。 Dockerfile中的每个命令都会生成一个新图层,你可以看到它的哈希值。这就是为什么你应该更逻辑地构建你的Dockerfile。 Dockerfile中的问题是您正在使用apt-get update。此命令在图像中的某处保存了一些关于已更新的包以及何时更新的小块。这将是每次运行此命令时会有所不同的时间戳,这就是它生成不同哈希的原因

<强>解决方案

创建单独的Dockerfile,运行apt-get update && apt-get install ...并预构建图像,然后为您的应用在FROM命令中使用此图像。