Docker 如何将ARG值传递给ENTRYPOINT?

Docker 如何将ARG值传递给ENTRYPOINT?,docker,dockerfile,docker-compose,docker-registry,Docker,Dockerfile,Docker Compose,Docker Registry,Docker 1.9允许将参数传递给dockerfile。见链接: 如何在入口点指令中传递相同的数据 我的dockerfile文件 ARG$Version=3.1 ENTRYPOINT/tmp/folder-$Version/sample.sh start 使用上述dockerfile创建容器时出错。 请建议在入口点指令中指定参数的正确方法是什么?ARG的语法应省略$ 不要使用ARG$Version=3.1,而是尝试ARG Version=3.1简短回答:您需要使用ENV ARG和ENV均未在E

Docker 1.9允许将参数传递给dockerfile。见链接:

如何在入口点指令中传递相同的数据

我的dockerfile文件

ARG$Version=3.1
ENTRYPOINT/tmp/folder-$Version/sample.sh start

使用上述dockerfile创建容器时出错。
请建议在入口点指令中指定参数的正确方法是什么?

ARG的语法应省略
$


不要使用
ARG$Version=3.1
,而是尝试
ARG Version=3.1
简短回答:您需要使用
ENV

ARG
ENV
均未在
ENTRYPOINT
CMD
中展开。()但是,由于
ENV
s是作为环境的一部分传入的,因此它们在运行时可用,因此shell可以扩展它们。(这意味着您不能使用
ENTRYPOINT
CMD
的数组形式)

以下是一个例子:

$ cat arg/Dockerfile
FROM debian:jessie
ARG FOO=bar
ENTRYPOINT echo ${FOO:-foo}
$ sudo docker build arg
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM debian:jessie
 ---> f50f9524513f
Step 2 : ARG FOO=bar
 ---> Using cache
 ---> 2cfdcb514b62
Step 3 : ENTRYPOINT echo ${FOO:-foo}
 ---> Running in 21fb9b42c10d
 ---> 75e5018bad83
Removing intermediate container 21fb9b42c10d
Successfully built 75e5018bad83
$ sudo docker run 75e5018bad83
foo
$ sudo docker run -e FOO=bas 75e5018bad83
bas
$ sudo docker build --build-arg FOO=bas arg
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM debian:jessie
 ---> f50f9524513f
Step 2 : ARG FOO=bar
 ---> Using cache
 ---> 2cfdcb514b62
Step 3 : ENTRYPOINT echo ${FOO:-foo}
 ---> Using cache
 ---> 75e5018bad83
Successfully built 75e5018bad83
$ sudo docker run 75e5018bad83
foo
$ cat env/Dockerfile
FROM debian:jessie
ARG FOO=bar
ENV FOO=${FOO}
ENTRYPOINT echo ${FOO:-foo}
$ sudo docker build env
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM debian:jessie
 ---> f50f9524513f
Step 2 : ARG FOO=bar
 ---> Using cache
 ---> 2cfdcb514b62
Step 3 : ENV FOO ${FOO}
 ---> Running in f157a07c1b3e
 ---> a5e8c5b65a17
Removing intermediate container f157a07c1b3e
Step 4 : ENTRYPOINT echo ${FOO:-foo}
 ---> Running in 66e9800ef403
 ---> 249fe326e9ce
Removing intermediate container 66e9800ef403
Successfully built 249fe326e9ce
$ sudo docker run 249fe326e9ce
bar
$ sudo docker run -e FOO=bas 249fe326e9ce
bas
$ sudo docker build --build-arg FOO=bas env
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM debian:jessie
 ---> f50f9524513f
Step 2 : ARG FOO=bar
 ---> Using cache
 ---> 2cfdcb514b62
Step 3 : ENV FOO ${FOO}
 ---> Running in 6baf31684b9f
 ---> 8f77ad154798
Removing intermediate container 6baf31684b9f
Step 4 : ENTRYPOINT echo ${FOO:-foo}
 ---> Running in 892ac47cabed
 ---> fa97da85bf8a
Removing intermediate container 892ac47cabed
Successfully built fa97da85bf8a
$ sudo docker run fa97da85bf8a
bas
$
像Blake Mitchell sais一样,您不能在
入口点中使用
ARG
。但是,您可以使用
ARG
作为
ENV
的值,这样您就可以将其与
入口点一起使用:

Dockerfile

ARG my_arg
ENV my_env_var=$my_arg

ENTRYPOINT echo $my_env_var
并运行:

docker build --build-arg "my_arg=foo" ...

我为此挣扎了一天,谢谢@Rotareti的提醒。它需要在
ENV
中才能用于
入口点

ENV variable=$from_ARG_variable
ENTRYPOINT exec your_exec_sh_file $variable

希望这能有所帮助。

如果您有多个参数要传递给ENTRYPOINT或CMD,您可以这样做:

FROM openjdk:8-jdk-alpine
ARG PROFILE
ENV PROFILE=${PROFILE}
...
CMD java -jar -Dspring.profiles.active=$(echo ${PROFILE}) /app/server.jar

因此,您要求提供选项,例如,
--entrypoint=/root/run.sh
?为什么环境变量在运行时可用的可能重复?“运行进程”是构建进程的子进程吗?我想,在单个可执行容器中没有可行的解决方法?如果没有echo命令,这将不起作用。对我来说是有效的!竖起大拇指!