0

我正在使用 JHipster 创建 springboot 应用程序,我认为它使用 JIB 创建 docker 容器。一切正常,但是做一个启动脚本或运行其他东西呢?在我的情况下,我需要启动一个 apt 安装的服务

CMD service pcscd start 

如果我只输入图像,这将不会在启动时发生。当我将它添加到 Kubernetes 中的 POD 定义中时,它会清除 springboot 应用程序启动并像我想要做的只是运行命令一样退出。如何运行将首先启动我的 pcscd 服务然后启动 spring boot 应用程序的启动脚本?

4

1 回答 1

2

有多种方法可以运行多个命令,主要使用 shell:

  1. 使用ENTRYPOINT. (但是,Dockerfile参考文献更喜欢下面的“exec 形式”。)在幕后,这个“shell 形式”实际上运行一个 shell 二进制文件(如/bin/sh)并让 shell 解释“脚本”(此处为echo one && echo two)。
FROM ubuntu:bionic
ENTRYPOINT echo one && echo two
  1. 使用ENTRYPOINT. 在这种情况下,直接调用 shell 二进制文件。
FROM ubuntu:bionic
ENTRYPOINT ["/bin/sh", "-c", "echo one && echo two"]
  1. 如果命令变得复杂,请考虑将它们放在一个文件中。与上面没有真正不同的是,现在 shell 二进制文件(如#/bin/sh下面文件顶部所示)解释了脚本文件中的内容。
echo -e '#/bin/sh'"\necho one && echo two" > my-entrypoint.sh
FROM ubuntu:bionic
COPY my-entrypoint.sh /
RUN chmod +x /my-entrypoint.sh
ENTRYPOINT /my-entrypoint.sh
  1. 像上面一样,但使用“执行形式”。
ENTRYPOINT ["/bin/sh", "-c", "/my-entrypoint.sh"]

(仅供参考,您可以使用ENTRYPOINTor组合CMD,但我不会深入讨论,因为执行多个命令通常ENTRYPOINT就足够了。您可以查看Dockerfile参考以了解如何ENTRYPOINTCMD交互。)

对于 Jib,您可以使用<container><entrypoint>/container.entrypoint自定义图像入口点。(检查MavenGradle参考资料。)您可以使用该<extraDirectories>功能(Maven / Gradle)提供任意文件,包括 shell 脚本。此外,还<extraDirectories>允许使用<permissions>例如给 shell 脚本提供可执行位。

另请注意,Jib 使用的默认 Java 基本映像没有/bin/sh二进制文件(shell),因此您必须使用具有 shell 的不同基本映像。

最后,请注意,我只是在回答如何实现为容器映像运行多个命令。这不一定是在 Kubernetes(或任何生产环境)上以稳健且有弹性的方式运行服务的理想方式。

于 2019-11-05T16:36:07.197 回答