如何将ARG值传递给ENTRYPOINT?

94

Docker 1.9允许向dockerfile传递参数。请参见链接:https://docs.docker.com/engine/reference/builder/#arg

我该如何在ENTRYPOINT指令中传递相同的参数?

我的dockerfile如下:

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

创建包含以上dockerfile的容器时,出现错误。请建议正确指定ENTRYPOINT指令中的参数的方法。


1
所以你要求选项,例如 --entrypoint=/root/run.sh - BMW
5个回答

110

正如Blake Mitchell所说,您不能在ENTRYPOINT中使用ARG。但是您可以将ARG用作ENV的值,这样您就可以在ENTRYPOINT中使用它:

Dockerfile

ARG my_arg
ENV my_env_var=$my_arg

ENTRYPOINT echo $my_env_var

并运行:

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

在单个可执行容器中没有解决方法可以工作,我想是吗? - Caesar
如果您没有echo命令,这将无法工作。 - 0xfede7c8
对我有用!点赞! - Deepesh Rehi
1
如果值相同,仅声明ENV与同时声明ARGENV有何不同?我仍然可以在docker run中覆盖ENV - Rohit Babu
2
值得一提的是,这个方法可行是因为ENTRYPOINT使用了shell形式,可以进行变量替换。如果你使用exec形式,这种方法就不起作用了。 - Valentin Despa

41

简短回答:您需要使用ENV

ARGENVENTRYPOINTCMD中不会被扩展。(https://docs.docker.com/engine/reference/builder/#environment-replacement)但是,由于ENV作为环境的一部分传递,因此它们在运行时可用,因此shell可以扩展它们。(这意味着您不能使用ENTRYPOINTCMD的数组形式。)

以下是一个示例:

$ 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
$

为什么环境变量在运行时可用?“运行进程”是构建进程的子进程吗? - Franklin Yu

9

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

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

8

我为此苦苦挣扎了一天,感谢 @Rotareti 的提醒。在使用 ENTRYPOINT 前需要将其放在 ENV 中。

ENV variable=$from_ARG_variable
ENTRYPOINT exec your_exec_sh_file $variable

希望这有所帮助。

1
在同一个问题上花了一些时间纠结。应该将ARG放入ENV中以便在ENTRYPOINT中使用。+1 - undefined

-2

ARG 的语法应省略 $ 符号。

不要使用 ARG $Version=3.1,而是尝试使用 ARG Version=3.1


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接