如何将选项传递给 docker ENTRYPOINT?

How to pass options to a docker ENTRYPOINT?

考虑命令:

ls [OPTION]... [FILE]...

选项在前,然后是文件。但是,不知何故,我不知道为什么 ls 不坚持这个顺序。因此 ls -la /homels /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