Как определить переменную в Dockerfile?

156

В моем Dockerfile я хотел бы определить переменные, которые я смогу использовать позже в Dockerfile .

Я знаю о ENV инструкции, но я не хочу, чтобы эти переменные были переменными среды.

Есть ли способ объявить переменные в области Dockerfile ?

Maxime
источник
10
Вы можете использовать ARG - см. docs.docker.com/engine/reference/builder/#arg
lumos0815
@ lumos0815, я думаю, что вы должны опубликовать это как свой ответ (даже если это старый пост; для потомков), поскольку это именно то, о чем просит OP.
визг
ARG не определяет переменную, которую можно использовать в файле Docker. Вы должны выполнить это с помощью команды ENV, чтобы получить то, что вы ищете; ARG Foo; ENV FOO = $ foo; COPY файл $ foo (извините за плохое форматирование, я думаю, что невозможно сделать кодовые блоки и многострочные с телефона)
ntwrkguru

Ответы:

111

Вы можете использовать ARG- см. Https://docs.docker.com/engine/reference/builder/#arg

ARGИнструкция определяет переменную , что пользователи могут проходить при построении времени строителя с docker buildкомандой , используя --build-arg <varname>=<value>флаг. Если пользователь указывает аргумент сборки, который не был определен в файле Docker, сборка выдает ошибку.

lumos0815
источник
@MargachChris должно быть возможно использовать переменные для COPY
lumos0815
Кажется, это не работает для команды COPY. docs.docker.com/engine/reference/builder/#arg
femibyte
54

Насколько мне известно, ENVпозволяет только это, как указано в « Замена окружающей среды »

Переменные среды (объявленные с помощью ENVоператора) также могут использоваться в определенных инструкциях как переменные, которые должны интерпретироваться Dockerfile.

Они должны быть переменными среды, чтобы их можно было повторно объявить в каждом новом контейнере, созданном для каждой строки файла Dockerfile docker build.

Другими словами, эти переменные интерпретируются не напрямую в Dockerfile, а в контейнере, созданном для строки Dockerfile, поэтому используется переменная окружения.


В этот день я использую и ARG( докер 1.10+, иdocker build --build-arg var=value ) и ENV.
Использование ARGодного означает, что ваша переменная видна во время сборки, а не во время выполнения.

Мой Dockerfile обычно имеет:

ARG var
ENV var=${var}

В вашем случае этого ARGдостаточно: я обычно использую его для установки переменной http_proxy, которая нужна сборке Docker для доступа к Интернету во время сборки.

VonC
источник
51

Чтобы ответить на ваш вопрос:

В моем Dockerfile я хотел бы определить переменные, которые я смогу использовать позже в Dockerfile.

Вы можете определить переменную с помощью:

ARG myvalue=3

Пробелы вокруг одинакового символа не допускаются.

И использовать его позже с:

RUN echo $myvalue > /test
Ортомала Локни
источник
13

Если переменная используется повторно в той же RUNинструкции, можно просто установить переменную оболочки. Мне очень нравится, как они подошли к этому с официальным Ruby Dockerfile .

Евгений Чернявский
источник
Отличный ответ. Хотя вы должны использовать ARG, если это возможно, иногда вам нужно назначать и повторно использовать динамическую переменную. Пример:RUN foo=$(date) && echo $foo
wisbucky
3

Вы можете использовать ARG variable defaultValueи во время команды запуска вы даже можете обновить это значение, используя --build-arg variable=value. Чтобы использовать эти переменные в файле Docker, вы можете ссылаться на них как$variable в команде run.

Примечание. Эти переменные будут доступны для команд Linux, например, RUN echo $variableи они не будут сохраняться в образе.

user2719152
источник