Как передать аргумент с запуском <image>для использования Dockerfile? - PullRequest
0 голосов
/ 29 декабря 2018

У меня есть этот простой Dockefile:

FROM alpine:3.7
ARG VAR1=initialValue
RUN mkdir $VAR1

ENV VAR2=goodValue
RUN mkdir $VAR2

Когда я строю изображение, передающее новое значение, создается папка newValue

docker build --build-arg VAR1=newValue -f Dockerfile -t test  .

Но когда я пытаюсь изменить значение VAR2 с помощью команды run , она не работает:

docker run  -e VAR2=betterValue   test

Создается папка goodValue ,(Однако, когда я exec , переменная среды контейнера и списка VAR2 теперь равна betterValue.)

Как передать аргумент с параметром run для использования в Dockerfile?Если это невозможно, какой обходной путь?

Ответы [ 3 ]

0 голосов
/ 29 декабря 2018

После нескольких часов поиска ...

Кажется, что возможный обходной путь для моего примера - изменить Dockerfile:

    FROM alpine:3.7

    ENTRYPOINT ["mkdir"]  
    CMD ["goodValue"]

, а затем предоставить новый аргумент для CMD в конце запустить команда:

docker run test betterValue
0 голосов
/ 29 декабря 2018

Думаю, у вас может быть лучший вариант, вместо того, чтобы передавать их в Docker CMD.Я думаю, что это то, что вы искали, чтобы создать с помощью env

FROM alpine:3.7
ARG VAR1=initialValue
RUN mkdir $VAR1

ENV VAR2=goodValue
RUN mkdir $VAR2
COPY docker-entrypoint.sh /usr/local/bin/
RUN chmod 777 /usr/local/bin/docker-entrypoint.sh \
    && ln -s /usr/local/bin/docker-entrypoint.sh /
RUN chmod +x /usr/local/bin/docker-entrypoint.sh
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["/bin/ash"]

и сделать каталог в вашей точке входа в Docker

#!/bin/ash
set -e

if [ "$1" = '/bin/ash' ]; then
    echo "container booting..."
    echo "creating directory having name $VAR2"
    mkdir -p $VAR2
fi

exec "$@"

enter image description here

0 голосов
/ 29 декабря 2018

Конечно, потому что вы путаете Docker's build и run этапы.Фактически, переменные среды работают нормально.

Вы вызываете docker run -e VAR2=betterValue test, и фактически вы запускаете контейнер с этим значением, но каталог goodValue был создан на этапе build .

Вам необходимо:

Позвонить VAR2=/foo docker build -t test ., чтобы создать папку /foo, созданную на этапе сборки.

...