说我在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
阶段传递?
答案 0 :(得分:2)
你可以在你的Dockerfile中结合ARG和ENV,就像我在“ARG or ENV, which one to use in this case?”中提到的那样
ARG FOO
ENV FOO=${FOO}
这样,您docker.r2g
就可以访问${FOO}
环境变量。
我猜这个参数也可以用docker run而不是docker build阶段传递?
如果在运行时给FOO一个值更有意义,那也是可能的:
docker run -e FOO=$(...) ...
答案 1 :(得分:1)
这种简单的方法对我有用:
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变量插值/解释。参见:How do I use Docker environment variable in ENTRYPOINT array?
但是,传递参数的一种更可靠的方法是使用$@
而不是env变量。因此,您应该做的是使用docker run
命令覆盖--entrypoint,如下所示:
docker run --entrypoint="foo" <tag> --bar $@
要了解有关如何正确覆盖入口点的正确语法,请确保一定要查找一下,但是总的来说这很奇怪-您必须将--entrypoint="foo"
放在之前标签名称,以及--entrypoint
的参数,标签名称的之后。很奇怪。