java 构建包+ SpringBoot:Docker映像的端口和配置问题

7eumitmz  于 2023-01-04  发布在  Java
关注(0)|答案(1)|浏览(240)

关于将SpringBoot项目的构建Docker映像从Dockerfile迁移到BuildPacks的小问题。
我有一个非常简单的SpringBoot应用程序需要容器化。为了做到这一点,我有一个非常简单的Dockerfile:

FROM my-custom-java-base-image

RUN install -d -o some-user -g some-user /var/log/supervisor
RUN chmod -R 755 /usr/local/some-user/

EXPOSE 9999

请注意,在这个Dockerfile中,有一个自定义的java基础映像,需要运行一些RUN命令(以及运行一些其他命令),并暴露一个自定义端口,而不是通常的8080。
这个形象建立罚款,一切都与它合作,非常高兴。
现在,从SpringBoot2.3开始,有了这个与Buildpacks集成的新特性,在那里,人们可以简单地运行./mvnw spring-boot:build-image,并构建一个非常好的分层Docker映像。
这个Layered Docker映像确实很酷,很多热门会议上的演讲都展示了这种新的映像构建方式的好处:
参考文献:
https://www.youtube.com/watch?v=44n_MtsggnI
https://www.youtube.com/watch?v=EVHHyiypiY0
然而,在所有的演示我可以找到在线,最初的Dockerfile是非常初级的,没有自定义端口,没有自定义命令,好像它只能为基本的工作

FROM alpine
WORKDIR /tmp
COPY target/myapp.jar myapp.jar
ENTRYPOINT [java -jar blablabla]

到目前为止,我所尝试的是在插件配置中找到一种方法来配置我需要的来自Dockerfile的东西

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <!-- Configuration to push the image to our own Dockerhub repository-->
                <configuration>
                    <image>
                        <name>docker.io/2013techsmarts/${project.artifactId}:latest</name>
                    </image>
some configuration for the port, some commands to run, etc
                </configuration>
            </plugin>
        </plugins>
    </build>

但运气不好。
每个人都在谈论的这种构建映像的新方法只适合非常基本的Dockerfile吗?
我可以如何改变端口,基础形象,添加自己的命令等,而使用构建包请?
谢谢

ukqbszuj

ukqbszuj1#

尝试挑选和回答你的问题,如果我错过了什么让我知道。
1.你通常不需要设置入口点。构建包会自动检测并设置正确的入口点。这应该适用于99%的Sping Boot 应用程序。它也比标准Docker ENTRYPOINT灵活得多,请参阅the docs on starting your container。如果你仍然觉得需要设置入口点,你必须提供更多的信息,说明你为什么要这么做以及你要做什么(这可能对新问题有好处)。

  1. buildpack中没有EXPOSE的等价物,但它的重要性可能比您想象的要小。EXPOSE只是设置元数据。
    EXPOSE指令实际上并不发布端口。它在构建映像的人员和运行容器的人员之间充当一种文档类型,说明要发布哪些端口。
    如果没有EXPOSE,就不能运行docker run -P,但是仍然可以运行docker run -p port:port,并且它的工作原理是一样的。
    如果你需要记录端口信息,这基本上是EXPOSE所做的,你可以添加一个包含端口信息的标签,构建包支持在生成的映像上设置任意标签。
    1.答复:
    每个人都在谈论的这种构建映像的新方法只适合非常基本的Dockerfile吗?
    不需要。Dockerfiles是构建映像的通用方法,适用于许多不同的情况。构建包不会尝试在每个用例中替换Dockerfiles。构建包的目标领域是将应用程序打包到容器映像中。如果您使用Docker或Kubernetes或其他容器编制器进行部署,那么构建包应该非常适合您。
    1.答复:
    如何更改基础映像
    使用构建包时,您有一个基本构建映像和一个基本运行映像。基本构建映像是运行构建包和编译应用程序时使用的基本容器映像。基本运行映像是应用程序在执行时使用的映像。构建映像通常大于基本映像,因为其中有更多的开发工具和库。
    您可以同时更改这两个版本。要更改构建映像,您必须更改构建器。即Sping Boot 构建工具配置中的<builder>标记或pack build-B标志。构建器包含基本构建映像以及所有构建包。它还具有元数据,用于指示与构建映像配对的运行映像。如果创建自定义构建器映像,你可以控制所有这些东西,只要你想要的细节,你只需要确保你使用的构建包与你创建的构建和运行映像兼容。Instructions for creating a builder can be found here
    如果你只需要改变运行镜像,那就容易多了,你可以在你的Sping Boot 构建工具中设置<runImage> config设置,它会覆盖构建器建议的运行镜像。
    执行此操作时需要小心,因为您需要确保使用构建映像构建的应用程序将在指定的运行映像上运行。这两个映像通常是成对的,以便在运行时提供运行应用程序所需的任何库。对于Java应用程序,这通常很容易,因为没有太多的系统依赖项。但是,您不能将运行映像设置为scratch,因为JVM确实有一些系统依赖项。
    你可能会想,“我该如何创建这些映像呢?”答案是一个Dockerfile。如前所述,Buildpack并不试图完全取代Dockerfiles,只是让某些用例更简单。这是一个用例,制作基本映像,其中Dockerfiles工作正常,所以你可以docker build你自己的基本构建器和运行映像。请参阅here for more detailed instructions
    创建您自己的构建/运行映像的过程在技术上并不困难,也不耗时,但它确实需要自动化,因为您 * 必须 * 保持这些映像最新,以便获得相关的安全修复。
    说了这么多,您可能不需要创建自定义映像。我不知道您的具体需求是什么,所以我鼓励您看看这篇SO帖子,它有一些可能的方法来自定义Sping Boot 生成的容器映像。
    我还建议你试着退一步,重新思考你必须解决的问题。通常情况下,将Dockerfile转换为Buildpacks会更复杂,并产生尴尬的结果,因为你试图重新实现你的Dockerfile解决方案。如果你转而考虑如何使用Buildpacks解决实际问题,你可能会得到一个更优雅的解决方案。

相关问题