Передать 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), вместо этого создайте файл во время конвейера и обязательно очистите всю конфиденциальную информацию.