2015-11-26 2 views
41

В моей Dockerfile, я хотел бы определить переменные, что я могу использовать позже в Dockerfile.Как определить переменную в файле Docker?

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

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

+7

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

+0

@ lumos0815, я думаю, вы должны опубликовать его в качестве ответа (даже если это старый пост; для потомков), поскольку именно это просит ОП. – shriek

ответ

34

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

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

21

Насколько мне известно, только ENV допускает, что, как указано в «Environment replacement»

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

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

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


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

Мои Dockerfile обычно:

ARG var 
ENV var=${var} 

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

6

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