将 ARG 传递给 ENTRYPOINT
Pass ARG to 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
阶段传递?
您可以在您的 Dockerfile 中组合 ARG 和 ENV,正如我在“”
中提到的
ARG FOO
ENV FOO=${FOO}
这样,您 docker.r2g
就可以访问 ${FOO}
环境变量。
I guess the argument could also be passed with docker run instead of during the docker build phase?
这也是可能的,如果在运行时给 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
不确定为什么后者不是首选 - 但环境变量 interpolation/interpretation 只能使用后者。参见:
但是,更可靠的传递参数的方法 是使用 $@
而不是环境变量。所以你应该做的是使用 docker run
命令覆盖 --entrypoint,像这样:
docker run --entrypoint="foo" <tag> --bar $@
要了解如何正确覆盖入口点的正确语法,你必须查一下,当然,但总的来说它很奇怪 - 你必须在 --entrypoint="foo"
标签名称,以及 --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
阶段传递?
您可以在您的 Dockerfile 中组合 ARG 和 ENV,正如我在“
ARG FOO
ENV FOO=${FOO}
这样,您 docker.r2g
就可以访问 ${FOO}
环境变量。
I guess the argument could also be passed with docker run instead of during the docker build phase?
这也是可能的,如果在运行时给 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
不确定为什么后者不是首选 - 但环境变量 interpolation/interpretation 只能使用后者。参见:
但是,更可靠的传递参数的方法 是使用 $@
而不是环境变量。所以你应该做的是使用 docker run
命令覆盖 --entrypoint,像这样:
docker run --entrypoint="foo" <tag> --bar $@
要了解如何正确覆盖入口点的正确语法,你必须查一下,当然,但总的来说它很奇怪 - 你必须在 --entrypoint="foo"
标签名称,以及 --entrypoint
的参数, 在 标签名称之后。奇怪。