【问题标题】:How to startup Spring Boot service AND run startup script如何启动 Spring Boot 服务并运行启动脚本
【发布时间】:2020-03-01 09:16:51
【问题描述】:

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

CMD service pcscd start 

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

【问题讨论】:

    标签: spring-boot jhipster jib


    【解决方案1】:
    推荐的答案 Google Cloud

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

    1. 使用ENTRYPOINT 的“shell 形式”运行命令。 (然而,Dockerfile 参考更喜欢下面的“exec 形式”。)在幕后,这个“shell 形式”实际上运行一个 shell 二进制文件(如 /bin/sh)并让 shell 解释“脚本”(这里,@ 987654329@)。
    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"]
    

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

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

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

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

    【讨论】:

    • 好的,在 src/main/jib/entrypoint.sh 中有 jhipster 生成的 entrypoint.sh 吗?
    猜你喜欢
    • 2019-10-07
    • 2017-06-12
    • 2018-07-12
    • 2022-01-24
    • 2013-09-03
    • 1970-01-01
    • 2021-10-19
    • 2018-07-12
    • 1970-01-01
    相关资源
    最近更新 更多