Подтвердить что ты не робот

Экспорт ENV против RUN

Скажем, я хочу объединить эти команды

RUN command_1
ENV FOO bar
RUN command_2

в

RUN command_1 && export FOO=bar && command_2

и задавался вопросом, является ли установка переменной с RUN export vs ENV эквивалентной.

Другими словами, существует ли разница между этими командами в файле Docker?

ENV FOO bar

против

RUN export FOO=bar
4b9b3361

Ответ 1

Как показано проблема 684, export не будет сохраняться через изображения. (Не забывайте, что каждая директива Dockerfile будет генерировать промежуточный контейнер, помещенный в промежуточное изображение: это изображение не сохранит экспортированное значение)
ENV будет:

Переменные среды, установленные с помощью ENV, будут сохраняться, когда контейнер будет запущен из полученного изображения.
Вы можете просмотреть значения с помощью docker inspect и изменить их с помощью docker run --env <key>=<value>.

Проблема иллюстрирует, что с помощью:

RUN export PATH=$PATH:/foo/bar # from directly in builder

Когда я делаю docker run [img] bash -c 'echo $PATH', он никогда не включает /foo/bar.

Попробуйте

Создайте новый файл докеров, содержащий:

FROM centos:6
ENV FOO=foofoo
RUN export BAR=barbar
RUN export BAZ=bazbaz && echo "$FOO $BAR $BAZ"

Затем постройте его. Результатом последнего шага является:

Step 4/4 : RUN export BAZ=bazbaz && echo "$FOO $BAR $BAZ"
 ---> Running in eb66196b238d
foofoo  bazbaz

Вы можете видеть:

  • FOO сохраняется через промежуточные контейнеры благодаря ключевому слову ENV;
  • BAR не сохраняется на следующем шаге из-за команды export;
  • BAZ отображается правильно, потому что переменная используется в одном контейнере.