2015-12-16 120 views
11

Docker 1.9允许将参数传递给dockerfile。见链接:https://docs.docker.com/engine/reference/builder/#arg如何将ARG值传递给ENTRYPOINT?

我怎样才能通过ENTRYPOINT指令内的相同的指甲?

我dockerfile有

ARG $版= 3.1
入口点/tmp/folder-$Version/sample.sh开始

,同时还与上述dockerfile容器我正在一个错误。 请建议什么是在ENTRYPOINT指令内指定参数的正确方法?

+0

所以你问的选项,例如'--entrypoint = /根/ run.sh'? – BMW

回答

0

由于您使用的是更大的表达式中的变量,它可能会受益于卷曲brakets包围:

ENTRYPOINT /tmp/folder-${Version}/sample.sh start 
2

ARG的语法应该忽略$

而不是ARG $Version=3.1,请尝试ARG Version=3.1

6

简短的回答:您需要使用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 
$ 
+0

为什么运行时可以使用环境变量? “运行过程”是构建过程的子过程吗? –

1

喜欢布雷克米切尔赛斯,你不能在ENTRYPOINT使用ARG。然而,你可以用你的ARG作为值ENV,这样你可以用ENTRYPOINT使用它:

Dockerfile

ARG my_arg 
ENV my_env=$my_arg 

ENTRYPOINT echo $my_env