Передать ARG в ENTRYPOINT

Скажем, у меня есть это в Dockerfile:

ARG FOO=1
ENTRYPOINT ["docker.r2g", "run"]

где я строю выше с:

docker build -t "$tag" --build-arg FOO="$(date +%s)" .

есть ли способ сделать что-то вроде:

ENTRYPOINT ["docker.r2g", "run", ARG FOO]  // something like this

Я предполагаю, что аргумент также может быть передан с docker run вместо фазы docker build?


person Alexander Mills    schedule 19.06.2018    source источник


Ответы (2)


Вы можете комбинировать ARG и ENV в своем Dockerfile, как я упоминал в "ARG или ENV, какой из них использовать в этом случае?"

ARG FOO
ENV FOO=${FOO}

Таким образом, вы docker.r2g сможете получить доступ к переменной окружения ${FOO}.

Я предполагаю, что аргумент также может быть передан с запуском докера, а не на этапе сборки докера?

Это также возможно, если имеет смысл присвоить FOO значение во время выполнения:

docker run -e FOO=$(...) ...
person VonC    schedule 19.06.2018
comment
другим решением может быть использование --entrypoint с командой запуска docker и передача там флага? если это сработает, не стесняйтесь добавить это к своему ответу, idk - person Alexander Mills; 19.06.2018
comment
@AlexanderMills Да, но если ваша точка входа по-прежнему docker.r2g, вместо этого вы можете переопределить CMD (поскольку CMD — это параметры, передаваемые в точку входа) - person VonC; 19.06.2018
comment
Я не уверен, что вы уже видели мой ответ, но мне пришлось перепробовать много вещей, чтобы заставить это работать правильно. Оказывается, попытка включить список аргументов в одну переменную env не так надежна, поэтому передача аргументов с использованием $@ с bash, вероятно, лучший способ. - person Alexander Mills; 20.06.2018
comment
спасибо, да, я понял, я обновил последнее добавление, используя docker run --entrypoint, мы можем переопределить ENTRYPOINT, что, вероятно, является лучшим способом передачи динамического списка аргументов. - person Alexander Mills; 20.06.2018

Эта простая техника работает для меня:

FROM node:9
# ...
ENTRYPOINT dkr2g run "$dkr2g_run_args"

затем мы запускаем контейнер с:

docker run \
    -e dkr2g_run_args="$run_args" \
    --name "$container_name" "$tag_name"

могут быть некоторые проблемы с пограничным случаем с распространением переменной env на аргументы командной строки, но по большей части должно работать.

ENTRYPOINT может работать так:

ENTRYPOINT ["foo", "--bar", "$baz"]  # $baz will not be interpreted

или так:

ENTRYPOINT foo --bar $baz

не уверен, почему последнее не является предпочтительным, но интерполяция/интерпретация переменных env возможна только с использованием последнего. См.: Как использовать переменную среды Docker в массиве ENTRYPOINT. ?

Однако более надежным способом передачи аргументов является использование $@ вместо переменной env. Итак, что вам нужно сделать, это переопределить --entrypoint с помощью команды docker run, например:

docker run --entrypoint="foo" <tag> --bar $@

Чтобы узнать правильный синтаксис того, как правильно переопределить точку входа, вы должны посмотреть это, чтобы быть уверенным, но в целом это странно - вы должны поставить --entrypoint="foo" перед именем тега и аргументами для --entrypoint, после имени тега. странный.

person Alexander Mills    schedule 19.06.2018