【问题标题】:Confusion about docker ENTRYPOINT关于 docker ENTRYPOINT 的困惑
【发布时间】:2020-01-28 19:02:01
【问题描述】:

我是 Docker 新手,请耐心等待。我编写了一个 Dockerfile,它在其中创建了一个带有 Java 语言 Spring Boot 服务的图像。我现在正在尝试设置一个入口点来启动容器中的服务。我选择编写一个外部 shell 脚本作为入口点调用。

这就是服务的设置方式。

构建项目时,会生成一个 zip 文件,其中包含服务 jar、所有依赖项 jar、配置资源和用于启动服务的 bash 脚本。该脚本接受许多参数,对其进行验证并使用它们来构造,然后执行“java”命令来运行服务。

如果您要以“非容器方式”运行它,您只需将 zip 文件解压缩到某个目录中并调用脚本,并传递必要的参数。如果所需的参数不存在,脚本会显示“使用”信息。

在 Docker 容器案例中,我试图从 Dockerfile 中的 ENTRYPOINT 找出如何做同样的事情。我在 ENTRYPOINT 中指定了我的启动器脚本,它确实调用了它,尽管当然没有传递任何参数,所以脚本退出并带有使用信息。

我不知道如何传递启动器脚本期望的参数。

我觉得我在使用 ENTRYPOINT 时遗漏了一个重要细节。

以下是相关文件的sn-ps,以说明我的情况。

Dockerfile

...
# Copy Route Assesssor service archive and unpack.
COPY target/route-assessor.zip .
RUN unzip route-assessor.zip

WORKDIR route-assessor
ENTRYPOINT ["run-route-assessor.sh"]

run-route-assessor.sh

我不会包含一个相当冗长的脚本,而是展示用法说明以了解该脚本期望的参数。

show_usage() {
  echo "Usage: `basename "$0"` <args>"
  echo "  --port=<service port>"
  echo "  --instance=<service instance> [optional, default: 1]"
  echo "  --uuid=<service UUID>"
  echo "  --ssl [optional]"
  echo "  --keystore=<key store path> [required when --ssl specified]"
  echo "  --key-alias=<key alias> [required when --ssl specified]"
  echo "  --apm-host=<Elastic APM server host> [optional]"
  echo "  --apm-port=<Elastic APM server port> [optional]"
}

从图像创建了一个容器实例:

[jo24447@489337-mitll route-assessor]$ docker create --name route-assessor-1 route-assessor

容器启动尝试示例:

[jo24447@489337-mitll route-assessor]$ docker start -ai route-assessor-1
Service port is required.
Usage: run-route-assessor.sh <args>
  --port=<service port>
  --instance=<service instance> [optional, default: 1]
  --uuid=<service UUID>
  --ssl [optional]
  --keystore=<key store path> [required when --ssl specified]
  --key-alias=<key alias> [required when --ssl specified]
  --apm-host=<Elastic APM server host> [optional]
  --apm-port=<Elastic APM server port> [optional]

[jo24447@489337-mitll route-assessor]$ docker start -ai route-assessor-1 --port=9100
unknown flag: --port
See 'docker start --help'.

【问题讨论】:

标签: docker


【解决方案1】:

如果你想运行一个带有一些默认参数的容器,你需要在CMD中定义这些参数:

ENTRYPOINT [ "./run-route-assessor.sh" ]
CMD ["-cmd1 value1 -cmd2 value2"]

所以你可以运行容器:

docker 运行镜像名称

如果你想覆盖没有参数的默认参数列表,你可以这样做:

docker run image-name "''"

但是更好的方法是向./run-route-assessor.sh 传递一个标志,让脚本处理如何在没有参数的情况下运行 Spring Boot 服务

docker run image-name -no-params

【讨论】:

    猜你喜欢
    • 2020-01-13
    • 2019-05-17
    • 2020-03-06
    • 2016-03-16
    • 2013-07-27
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多