Як визначити змінну в Dockerfile?


155

У своєму Dockerfile я хотів би визначити змінні, які я можу використовувати пізніше в Dockerfile .

Мені відомо ENVінструкція, але я не хочу, щоб ці змінні були змінними середовища.

Чи є спосіб оголосити змінні в Dockerfile області ?


10
ви можете використовувати ARG - див. docs.docker.com/engine/reference/builder/#arg
lumos0815

@ lumos0815, я думаю, ви повинні опублікувати це як свою відповідь (навіть якщо це старий пост; для нащадків), оскільки саме це просить ОП.
крик

ARG не визначає var, який можна використовувати в dockerfile. Вам доведеться це поєднати з командою 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>прапор. Якщо користувач вказує аргумент збірки, який не був визначений в Dockerfile, збірка видає помилку.


@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, яка потребує побудови докера для доступу до Інтернету під час збирання.


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і вони не збережуться у зображенні.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.