我正在使用JHipster创建springboot应用程序,并且我认为它使用JIB创建了docker容器。一切正常,但是执行启动脚本或运行其他操作呢?就我而言,我需要启动apt安装的服务
CMD service pcscd start
如果我仅显示图片,则启动时不会发生。当我将其添加到Kubernetes的POD定义中时,它消除了springboot应用程序的启动,并且像我想做的所有退出操作一样退出。如何运行启动脚本,该脚本将首先启动pcscd服务,然后再启动spring boot应用程序?
答案 0 :(得分:1)
有多种方法可以运行多个命令,主要是使用shell:
ENTRYPOINT
的“ shell形式”运行命令。 (但是,Dockerfile
引用更喜欢下面的“ exec形式”。)在幕后,这个“ shell形式”实际上运行一个shell二进制文件(如/bin/sh
),并让shell解释“脚本” (在这里,echo one && echo two
)。FROM ubuntu:bionic
ENTRYPOINT echo one && echo two
ENTRYPOINT
的“执行表单”运行命令。在这种情况下,将直接调用shell二进制文件。FROM ubuntu:bionic
ENTRYPOINT ["/bin/sh", "-c", "echo one && echo two"]
#/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
ENTRYPOINT ["/bin/sh", "-c", "/my-entrypoint.sh"]
(仅供参考,您可以使用ENTRYPOINT
或CMD
进行合并,但是我不愿赘述,因为对于执行多个命令,通常ENTRYPOINT
就足够了。您可以检查Dockerfile
参考资料以了解ENTRYPOINT
和CMD
的相互作用。)
对于Jib,您可以使用<container><entrypoint>
/ container.entrypoint
自定义图像入口点。 (检查Maven和Gradle引用。)然后,您可以使用<extraDirectories>
功能(Maven / Gradle)提供包括shell脚本的任意文件。此外,<extraDirectories>
允许使用<permissions>
向shell脚本提供可执行位。
还请注意,Jib使用的默认Java基本映像没有/bin/sh
二进制文件(外壳程序),因此您将不得不使用具有外壳程序的其他基本映像。
最后,请注意,我只是在回答如何实现对容器映像运行多个命令。这不一定是在Kubernetes(或任何生产环境)上以健壮和有弹性的方式运行服务的理想方法。