Dockerfile: установка нескольких переменных среды в одной строке

У меня создалось впечатление, что переменные окружения могут быть установлены на одной строке следующим образом, чтобы минимизировать промежуточные изображения.

FROM alpine:3.6
ENV RUBY_MAJOR 2.4 \
    RUBY_VERSION 2.4.1 \
    RUBY_DOWNLOAD_SHA256 4fc8a9992de3e90191de369270ea4b6c1b171b7941743614cc50822ddc1fe654 \
    RUBYGEMS_VERSION 2.6.12 \
    BUNDLER_VERSION 1.15.3

Однако запуск контейнера на основе этого фрагмента и вызов # set |grep RU Я вижу, что переменные не назначаются отдельно, а объединены в одну строку.

RUBY_MAJOR='2.4     RUBY_VERSION 2.4.1     RUBY_DOWNLOAD_SHA256 4fc8a9992de3e90191de369270ea4b6c1b171b7941743614cc50822ddc1fe654     RUBYGEMS_VERSION 2.6.12     BUNDLER_VERSION 1.15.3'

Однако, если я явно задал каждую переменную, как показано ниже, я получаю ожидаемый результат и ошибок при вызове переменных нет.

ENV RUBY_MAJOR 2.4
ENV RUBY_VERSION 2.4.1
ENV RUBY_DOWNLOAD_SHA256 4fc8a9992de3e90191de369270ea4b6c1b171b7941743614cc50822ddc1fe654
ENV RUBYGEMS_VERSION 2.6.12
ENV BUNDLER_VERSION 1.15.3

Вопрос: Можно ли комбинировать параметры среды в одной строке? Если да, то как мне это сделать? И это хорошая практика?

Ответы

Ответ 1

Существует два формата для определения среды. Если вам нужна одиночная переменная, то вы ниже формата

ENV X Y

Это назначит X как Y

ENX X Y Z

Это назначит X как YZ

Если вам нужно назначить несколько переменных среды, то вы используете другой формат

ENV X=Y Z=A

Это назначит X как Y и Z как A Таким образом, ваш Dockerfile должен быть

FROM alpine:3.6
ENV RUBY_MAJOR=2.4 \
    RUBY_VERSION=2.4.1 \
    RUBY_DOWNLOAD_SHA256=4fc8a9992de3e90191de369270ea4b6c1b171b7941743614cc50822ddc1fe654 \
    RUBYGEMS_VERSION=2.6.12 \
    BUNDLER_VERSION=1.15.3

RUN env

Ответ 2

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

из лучших практик написания Dockerfiles

Минимизируйте количество слоев

До Docker 17.05 и даже больше, до Docker 1.10, было важно минимизировать количество слоев в вашем изображении. Следующие улучшения смягчили эту потребность:

  • В Docker 1.10 и выше только команды RUN, COPY и ADD создают слои. Другие инструкции создают временные промежуточные изображения и больше не увеличивают размер сборки напрямую.

  • Docker 17.05 и выше поддерживают поддержку многоступенчатых сборок, которые позволяют копировать только артефакты, которые вам нужны, в окончательное изображение. Это позволяет включать инструменты и отладочную информацию на этапах промежуточной сборки, не увеличивая размер конечного изображения.