Использование ARG и ENV в Dockerfile

Я изучаю, как использовать ARG и ENV в Dockerfiles. У меня есть этот простой Dockerfile:

ARG my_arg
ARG other_arg=other_default

FROM centos:7

ENV MY_ENV $my_arg
ENV OTHER_ENV $other_arg

CMD echo "$MY_ENV $OTHER_ENV"

Когда я его построю: docker build --build-arg my_arg=my_value

И запустите его: docker run <resulting-image>

Я не вижу ожидаемого результата, который был бы

my_value other_default

Вместо этого я вижу пустую строку. Что я делаю не так?


person Thomas Hirsch    schedule 28.02.2020    source источник


Ответы (2)


В Dockerfile каждая строка FROM запускает новый образ и обычно сбрасывает среду сборки. Если на вашем изображении необходимо указать ARG, они должны идти после строки FROM; если это многоэтапная сборка, их нужно повторять в каждом образе по мере необходимости. ARG перед первым FROM полезны только для разрешения переменных в строке FROM, но не могут использоваться иначе.

Это подробнее обсуждается в разделе Понимание того, как ARG и FROM взаимодействовать в документации Dockerfile.

FROM centos:7

# _After_ the FROM line
ARG my_arg
ARG other_arg=other_default
...
person David Maze    schedule 28.02.2020
comment
По сути, меня смутило то, что ARG — это единственная инструкция, которая может предшествовать FROM в Dockerfile., просто интерпретируя это как намек на то, что вы хотели бы поставить ARG перед FROM по стилистическим причинам, но я не нажимал на ссылку. - person Thomas Hirsch; 28.02.2020
comment
Что если передать ARGs с помощью параметра --build-arg в командной строке? Они уничтожаются, когда Докер нажимает FROM? - person MiloDC; 02.05.2020
comment
Вам нужно объявить ARG и передать параметр --build-arg. Если вы объявили ARG везде, где это необходимо, каждое использование должно получать одно и то же значение из командной строки. - person David Maze; 02.05.2020

Начиная с 20.10.2 или более ранних версий, ARG можно передавать из-за пределов строки FROM и далее, все, что вам нужно сделать, это вставить еще один ARG с тем же именем после FROM:

ARG my_arg
ARG other_arg=other_default

FROM centos:7

# These need to be re-stated here to use the ARGs above.
ARG my_arg
ARG other_arg # This will be populated with the default value 'other_default'.

ENV MY_ENV $my_arg
ENV OTHER_ENV $other_arg

CMD echo "$MY_ENV $OTHER_ENV"
person Daniel    schedule 11.02.2021