Как копировать переменные между этапами многоступенчатой ​​сборки Docker?

Я видел только примеры использования COPY для копирования файлов между этапами многоступенчатого Dockerfile, но есть ли способ просто скопировать переменную ENV? Мой вариант использования - начать с образа git, чтобы просто получить хеш фиксации, который будет частью сборки. Изображение, с которым я позже работаю, не содержит мерзавца.

Я понимаю, что могу просто передать хеш git в файл и использовать COPY, но мне просто интересно, есть ли более чистый способ?


person Viktor Hedefalk    schedule 20.10.2018    source источник


Ответы (2)


У вас есть 3 варианта: решение «ARG», «базовое» решение и «файловое» решение.

ARG version_default=v1

FROM alpine:latest as base1
ARG version_default
ENV version=$version_default
RUN echo ${version}
RUN echo ${version_default}

FROM alpine:latest as base2
ARG version_default
RUN echo ${version_default}

Другой способ - использовать базовый контейнер для нескольких этапов:

FROM alpine:latest as base
ARG version_default
ENV version=$version_default

FROM base
RUN echo ${version}

FROM base
RUN echo ${version}

Вы можете найти более подробную информацию здесь: https://github.com/moby/moby/issues/37345 < / а>

Также вы можете сохранить хэш в файл на первом этапе и скопировать файл на втором этапе, а затем прочитать его и использовать там.

person Jinxmcg    schedule 20.02.2019
comment
Просто имейте в виду, что если вы пойдете с базовым маршрутом контейнера, если вы предоставите какие-либо учетные данные в слоях на этом первом этапе, они появятся в окончательном изображении, что почти наверняка не то, что вам нужно. - person icfantv; 07.11.2020

Совместное использование переменных между этапами в Dockerfile:

  1. на первом этапе сохраните переменные / ENV в файл: RUN apk add --no-cache --virtual .run-deps `cat /runtime.deps` gnutls-utils iptables libnl3 readline gettext libintl
person Iceberg    schedule 25.06.2021