【发布时间】:2020-03-08 06:53:39
【问题描述】:
我有一个包含很多层的 docker 文件。在文件的顶部,我有一些参数,例如
FROM ubuntu:18.04
ARGS USER=test-user
ARGS UID=1000
#ARGS PW=test-user
# Then several Layers which does not use any ARGS. Example
LABEL version="1.0"
ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
RUN mkdir ~/mapped-volume
RUN apt-get update && apt-get install -y wget bzip2 ca-certificates build-essential curl git-core htop pkg-config unzip unrar tree freetds-dev vim \
sudo nodejs npm net-tools flex perl automake bison libtool byacc
# And so on
# And finally towards the end
# Setup User
RUN useradd -m -d /home/${USER} --uid ${UID} -G sudo -s /bin/bash ${USER}
# && echo "${USER}:${PW}" | chpasswd
# Couple of more commands to change dir, entry point etc. Example
当我使用与上次构建不同的任何 arg 值和/或在最后两层发生小的更改后构建此 docker 文件时,构建会再次构建所有内容。它不使用缓存层。我用来构建的命令是这样的
docker build --build-arg USER=new-user --build-arg UID=$UID -t my-image:1.0 .
每次我更改值时,构建都会再次进行。像下面这样截断的顶部
UID -t my-image:1.0 .
Sending build context to Docker daemon 44.54kB
Step 1/23 : FROM ubuntu:18.04
---> ccc6e87d482b
Step 2/23 : ARG USER=ml-user
---> Using cache
---> 6c0c5d5c5056
Step 3/23 : ARG UID=1000
---> Using cache
---> b25867c282c7
Step 4/23 : LABEL version="1.0"
---> Running in 1ffff70d56c1
Removing intermediate container 1ffff70d56c1
---> 0f1277def3ca
Step 5/23 : ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
---> Running in 49d08c41b233
Removing intermediate container 49d08c41b233
---> f5b345573c1f
Step 6/23 : RUN mkdir ~/mapped-volume
---> Running in e4f8a5956450
Removing intermediate container e4f8a5956450
---> 1b22731d9051
Step 7/23 : RUN apt-get update && apt-get install -y wget bzip2 ca-certificates build-essential curl git-core htop pkg-config unzip unrar tree freetds-dev vim sudo nodejs npm net-tools flex perl automake bison libtool byacc
---> Running in ffc297de6234
Get:1 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB]
所以从第 7 步开始,它会继续执行所有步骤,而不使用应该有一堆包的那个层的缓存 为什么?我怎样才能阻止这个?以前我没有args的时候,这个层和其他层都是从缓存中提取出来的。
【问题讨论】:
-
感谢@jonrsharpe - 但我仍在处理它并对其进行编辑以确保格式正确。您在几毫秒内进行了编辑并投了反对票。在发布帖子后至少 2 分钟后才对其进行格式化投票是否公平?谢谢
-
风格方面,我会删除所有这些选项——没有特别的理由让用户 ID 在构建时参数化(在 my 系统上,我的本地 uid 是 501 ,这是否意味着我不能使用您构建的图像?),您通常不会在容器中使用
sudo,并且允许使用以纯文本形式提交的密码登录也不是一个好习惯。 -
就问题而言,您能否编辑 Dockerfile 以包含一些您不希望重复的特定命令,以及演示该问题的确切
docker build命令?docker build将打印出每一行,即使它不重复工作。 -
同意@David Maze。密码绝对是个坏主意。我只是在玩。至于ID,那很棘手。它出现在参数上的原因是因为容器上映射了一个磁盘,该磁盘针对主机上已安装的卷,该卷为主机上的用户设置了一些权限 - 并且需要相同的权限才能在容器内传播。您可以使用我的图像,但需要使用您要使用的 ID 来构建它。我将尝试在有关图层的问题中添加更多详细信息
标签: docker dockerfile