如何将 ARG 值传递给 ENTRYPOINT?
How to pass ARG value to ENTRYPOINT?
Docker 1.9 允许将参数传递给 dockerfile。参见 link:https://docs.docker.com/engine/reference/builder/#arg
如何在 ENTRYPOINT 指令中传递相同的参数??
我的 dockerfile 有
ARG $Version=3.1
ENTRYPOINT /tmp/folder-$Version/sample.sh start
我在使用上述 dockerfile 创建容器时遇到错误。
请建议在 ENTRYPOINT 指令中指定参数的正确方法是什么?
ARG
的语法应省略 $
。
而不是 ARG $Version=3.1
,试试 ARG Version=3.1
。
简答:您需要使用 ENV
ARG
和 ENV
都没有在 ENTRYPOINT
或 CMD
中扩展。 (https://docs.docker.com/engine/reference/builder/#environment-replacement) 但是,由于 ENV
作为环境的一部分传入,它们在 运行 时可用,因此 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 说的那样,您不能在 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" ...
我为此苦苦挣扎了一天,感谢@Rotareti 的提及。它需要在 ENV
才能用于 ENTRYPOINT
.
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
Docker 1.9 允许将参数传递给 dockerfile。参见 link:https://docs.docker.com/engine/reference/builder/#arg
如何在 ENTRYPOINT 指令中传递相同的参数??
我的 dockerfile 有
ARG $Version=3.1
ENTRYPOINT /tmp/folder-$Version/sample.sh start
我在使用上述 dockerfile 创建容器时遇到错误。 请建议在 ENTRYPOINT 指令中指定参数的正确方法是什么?
ARG
的语法应省略 $
。
而不是 ARG $Version=3.1
,试试 ARG Version=3.1
。
简答:您需要使用 ENV
ARG
和 ENV
都没有在 ENTRYPOINT
或 CMD
中扩展。 (https://docs.docker.com/engine/reference/builder/#environment-replacement) 但是,由于 ENV
作为环境的一部分传入,它们在 运行 时可用,因此 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 说的那样,您不能在 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" ...
我为此苦苦挣扎了一天,感谢@Rotareti 的提及。它需要在 ENV
才能用于 ENTRYPOINT
.
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