Передать 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 фаза?

3 ответа

Решение

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

ARG FOO
ENV FOO=${FOO}

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

Я думаю, что аргумент также может быть передан с Docker Run, а не во время фазы сборки Docker?

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

docker run -e FOO=$(...) ...

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

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после имени тега. странно.

В моем случае мне нужно было установить это во время сборки, то есть у меня не было контроля надdocker runкоманда, поэтому я действительно боролся с ней, потому что это не сработало, чтобы использовать ее какARGилиENVдирективы в Dockerfile. Итак, ниже было мое решение, и оно сработало как шарм:

      ENTRYPOINT export $(grep -v '^#' .env | xargs -d '\n') \
    && your_command_passing_the_variable ${FOO}

По сути, я скопировал переменные в файл, а затем экспортировал значения в тот же экземпляр bash, созданныйENTRYPOINTдиректива. Значение фиксируется и правильно передается команде. Надеюсь, это поможет.

Примечание. Если вам нужно поместить секреты в этот файл, не добавляйте файл в систему контроля версий (например, git), вместо этого создайте файл во время конвейера и обязательно очистите всю конфиденциальную информацию.

Другие вопросы по тегам