为什么我不能在Dockerfile中的FROM之后再次使用构建arg?

ger*_*ijk 3 docker dockerfile docker-build

我正在使用Docker 18.05.0~ce~3-0~ubuntu,我想将构建参数传递给FROM以及我的Dockerfile中的其他行.你会期望以下工作:

ARG FROM_IMAGE=ubuntu:bionic
FROM $FROM_IMAGE

COPY sources_list/$FROM_IMAGE /etc/apt/sources.list
Run Code Online (Sandbox Code Playgroud)

它适用于第二行(FROM),但它的行为类似于COPY行中未设置:

第1/3步:ARG FROM_IMAGE = ubuntu:仿生步骤2/3:FROM $ FROM_IMAGE ---> 8626492fecd3 [...]步骤3/3:COPY sources_list/$ {SOURCES_LIST_FILE} /etc/apt/sources.list失败复制文件:无法复制目录:mkdir /var/lib/docker/overlay2/0536b4e280ddca2fec18db9d79fa625a8be86efdbaaea5b3dbbefcdaaab3f669/merged/etc/apt/sources.list:不是目录

如果添加另一个单独的构建arg,它适用于同一COPY行:

ARG FROM_IMAGE=ubuntu:bionic
FROM $FROM_IMAGE

ARG SOURCES_LIST_FILE
COPY sources_list/${SOURCES_LIST_FILE} /etc/apt/sources.list
Run Code Online (Sandbox Code Playgroud)

步骤4/4:COPY sources_list/$ {SOURCES_LIST_FILE} /etc/apt/sources.list ---> 7f974fffe929

为什么我不能FROM_IMAGEFROM一行之前和之后使用构建arg两次?我没有找到任何记录在案的限制.

Con*_*nst 6

为什么我不能在FROM行之前和之后两次使用FROM_IMAGE构建arg?

根据您将ARG与FROM行相关的位置存在真正的差异:

  • 第一个FROM之前的任何ARG都可以在任何FROM行中使用
  • 构建阶段(在FROM之后)中的任何ARG都可以在该构建阶段中使用

这与构建阶段机制有关,可以在这里找到一些实际行为的参考:https://github.com/docker/cli/pull/333,以及为什么文档和构建机制在ARG使用上有点混乱的讨论在这里:https://github.com/moby/moby/issues/34129

  • 没错.它在这里解释:https://docs.docker.com/engine/reference/builder/#understand-how-arg-and-from-interact我应该基本上重复FROM行之后的ARG语句. (2认同)