如何将选项传递给 docker ENTRYPOINT?
How to pass options to a docker ENTRYPOINT?
考虑命令:
ls [OPTION]... [FILE]...
选项在前,然后是文件。但是,不知何故,我不知道为什么 ls
不坚持这个顺序。因此 ls -la /home
和 ls /home -la
产生相同的输出。
我们可以使用这个怪癖将 选项 发送到知道其 [FILE]
参数的 ls
。
FROM ubuntu:22.04
ENTRYPOINT ["ls", "/home"]
然后传递参数与传递选项相同:
$ docker build -t test .
$ docker run test
$ docker run test -la
total 8
drwxr-xr-x 2 root root 4096 Apr 18 10:28 .
drwxr-xr-x 1 root root 4096 May 12 16:58 ..
但是有些程序坚持选项和参数的顺序。例如 .jar
和 Spring 服务器应用程序:
这按预期工作:
java -jar -Dspring.profiles.active=ci backend.jar
这不是:
java -jar backend.jar -Dspring.profiles.active=ci
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
中的 [COMMAND]
和 [ARG...]
似乎 附加 到入口点并且 未插入.
有什么方法可以将选项而不是参数传递给 docker ENTRYPOINT
?
假设你想保留 java -jar backend.jar
部分,你可以添加一个小的 shell 脚本,它接受你放在最后的参数并在之前传递它们。 See the selected answer here 详细了解如何做到这一点
您用作 CMD
的所有内容,可能来自 Dockerfile 或 运行 镜像时,都作为参数传递给 ENTRYPOINT
。
您可以创建更复杂的入口点,最好通过脚本。
#!/usr/bin/env sh
exec java -jar $@ backend.jar
我正在使用 $@
,这是传递给脚本的所有参数,实际上是 CMD
.
此外,我正在使用 exec
生成进程 ID (pid) 1 的最终 java
命令 运行,以便它正确接收信号。例如 SIGTERM
.
您可以为此使用 CMD
。
ENTRYPOINT ["java"]
CMD ["-jar", "-Dspring.profiles.active=ci", "backend.jar"]
这还允许您在运行时更改参数。例如
docker run <image> -jar -Dspring.profiles.active=debug backend.jar
考虑命令:
ls [OPTION]... [FILE]...
选项在前,然后是文件。但是,不知何故,我不知道为什么 ls
不坚持这个顺序。因此 ls -la /home
和 ls /home -la
产生相同的输出。
我们可以使用这个怪癖将 选项 发送到知道其 [FILE]
参数的 ls
。
FROM ubuntu:22.04
ENTRYPOINT ["ls", "/home"]
然后传递参数与传递选项相同:
$ docker build -t test .
$ docker run test
$ docker run test -la
total 8
drwxr-xr-x 2 root root 4096 Apr 18 10:28 .
drwxr-xr-x 1 root root 4096 May 12 16:58 ..
但是有些程序坚持选项和参数的顺序。例如 .jar
和 Spring 服务器应用程序:
这按预期工作:
java -jar -Dspring.profiles.active=ci backend.jar
这不是:
java -jar backend.jar -Dspring.profiles.active=ci
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
中的 [COMMAND]
和 [ARG...]
似乎 附加 到入口点并且 未插入.
有什么方法可以将选项而不是参数传递给 docker ENTRYPOINT
?
假设你想保留 java -jar backend.jar
部分,你可以添加一个小的 shell 脚本,它接受你放在最后的参数并在之前传递它们。 See the selected answer here 详细了解如何做到这一点
您用作 CMD
的所有内容,可能来自 Dockerfile 或 运行 镜像时,都作为参数传递给 ENTRYPOINT
。
您可以创建更复杂的入口点,最好通过脚本。
#!/usr/bin/env sh
exec java -jar $@ backend.jar
我正在使用 $@
,这是传递给脚本的所有参数,实际上是 CMD
.
此外,我正在使用 exec
生成进程 ID (pid) 1 的最终 java
命令 运行,以便它正确接收信号。例如 SIGTERM
.
您可以为此使用 CMD
。
ENTRYPOINT ["java"]
CMD ["-jar", "-Dspring.profiles.active=ci", "backend.jar"]
这还允许您在运行时更改参数。例如
docker run <image> -jar -Dspring.profiles.active=debug backend.jar