一尘不染

为什么在FROM中之后在Dockerfile中不能再次使用build arg?

docker

我正在使用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

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

步骤1/3:ARG FROM_IMAGE = ubuntu:bionic步骤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:不是目录

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

ARG FROM_IMAGE=ubuntu:bionic
FROM $FROM_IMAGE

ARG SOURCES_LIST_FILE
COPY sources_list/${SOURCES_LIST_FILE} /etc/apt/sources.list

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

为什么我不能FROM_IMAGEFROM一行和一行之后两次使用build arg ?我找不到任何记录在案的这种限制。


阅读 335

收藏
2020-06-17

共1个答案

一尘不染

为什么在FROM行上或之后不能两次使用FROM_IMAGE build arg?

实际差异取决于您将ARG与FROM行相关的位置:

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

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

2020-06-17