Почему я не могу снова использовать аргумент сборки после FROM в Dockerfile?

Я использую 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: не каталог

Если добавить еще один, отдельный аргумент сборки, он будет работать для той же строки 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_IMAGE дважды, в строке FROM и после нее? Я не могу найти никаких задокументированных ограничений такого рода.


person gertvdijk    schedule 11.05.2018    source источник


Ответы (1)


Почему я не могу использовать аргумент сборки FROM_IMAGE дважды, в строке FROM и после нее?

Существует реальная разница в зависимости от того, где вы поместили ARG, относящуюся к строке FROM:

  • любой ARG перед первым FROM может использоваться в любой строке FROM
  • любая ARG на этапе сборки (после FROM) может использоваться на этом этапе сборки

Это связано с механикой этапов сборки, и некоторые сведения о реальном поведении можно найти здесь: https://github.com/docker/cli/pull/333, а обсуждение того, почему документация и механизмы сборки немного сбивают с толку при использовании ARG, находится здесь: https://github.com/moby/moby/issues/34129

person Const    schedule 11.05.2018
comment
О да. Это объясняется здесь: docs.docker.com / engine / reference / builder /, и я должен просто повторить оператор ARG после строки FROM. - person gertvdijk; 11.05.2018