В моем Dockerfile я хотел бы определить переменные, которые я смогу использовать позже в Dockerfile .
Я знаю о ENV
инструкции, но я не хочу, чтобы эти переменные были переменными среды.
Есть ли способ объявить переменные в области Dockerfile ?
В моем Dockerfile я хотел бы определить переменные, которые я смогу использовать позже в Dockerfile .
Я знаю о ENV
инструкции, но я не хочу, чтобы эти переменные были переменными среды.
Есть ли способ объявить переменные в области Dockerfile ?
Ответы:
Вы можете использовать ARG
- см. Https://docs.docker.com/engine/reference/builder/#arg
ARG
Инструкция определяет переменную , что пользователи могут проходить при построении времени строителя сdocker build
командой , используя--build-arg <varname>=<value>
флаг. Если пользователь указывает аргумент сборки, который не был определен в файле Docker, сборка выдает ошибку.
Насколько мне известно, 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 для доступа к Интернету во время сборки.
Чтобы ответить на ваш вопрос:
В моем Dockerfile я хотел бы определить переменные, которые я смогу использовать позже в Dockerfile.
Вы можете определить переменную с помощью:
ARG myvalue=3
Пробелы вокруг одинакового символа не допускаются.
И использовать его позже с:
RUN echo $myvalue > /test
Если переменная используется повторно в той же RUN
инструкции, можно просто установить переменную оболочки. Мне очень нравится, как они подошли к этому с официальным Ruby Dockerfile .
RUN foo=$(date) && echo $foo
Вы можете использовать ARG variable defaultValue
и во время команды запуска вы даже можете обновить это значение, используя --build-arg variable=value
. Чтобы использовать эти переменные в файле Docker, вы можете ссылаться на них как$variable
в команде run.
Примечание. Эти переменные будут доступны для команд Linux, например, RUN echo $variable
и они не будут сохраняться в образе.