从 Spring Boot Jar 构建 Docker 映像

Posted

技术标签:

【中文标题】从 Spring Boot Jar 构建 Docker 映像【英文标题】:Building Docker image from Spring Boot Jar 【发布时间】:2017-02-11 18:22:46 【问题描述】:

我正在尝试学习如何使用 spring boot fat jar 启动和运行 Docker。我已经安装了所有东西,可以从 Docker Hub 运行 Hello World 示例。

我使用名为 predictive-text-tree-0.0.1-SNAPSHOT.jar 的 Maven 创建了胖 jar,并将以下内容用作我的 dokerfile.docker:

FROM java:8
MAINTAINER ltocode
EXPOSE 8080
ADD predictive-text-tree-0.0.1-SNAPSHOT.jar /data/predictive-text-tree-0.0.1-SNAPSHOT.jar
CMD java -jar /data/textpredict.jar

我在服务器上有 jar 和 docker 文件,当我运行 docker build 命令时,我得到以下信息:

~/build# docker build -t predictable-text-tree-0.0.1-SNAPSHOT.jar

t 的参数“predictive-text-tree-0.0.1-SNAPSHOT.jar”无效:解析参考时出错:“predictive-text-tree-0.0.1-SNAPSHOT.jar”不是有效的存储库/标签 请参阅“docker build --help”。

如何从 fat jar 构建 docker 镜像?

【问题讨论】:

【参考方案1】:

您在构建命令中提供了不正确的参数。 -t 参数用于标记生成的图像。这意味着,-t 应该后跟图像名称,而不是 jar 文件。您可以在docker build document找到更多详细信息。

【讨论】:

【参考方案2】:

我也有同样的情况。 我有一个使用嵌入式 H2 数据库的示例 Spring Boot 应用程序。我已经制作了一个 Dockerfile 如下。

FROM openjdk:8
EXPOSE 8081
ADD target/book-rest-api-reactjs-0.0.1-SNAPSHOT.jar book-rest-api-reactjs-0.0.1-SNAPSHOT.jar
ENTRYPOINT ["java","-jar","/book-rest-api-reactjs-0.0.1-SNAPSHOT.jar"] 

然后我使用以下命令构建 docker。

docker build -t book-rest-api-reactjs.jar .

接下来使用以下命令列出图像以确保图像在本地可用。

docker 镜像 ls

然后使用以下命令运行映像。

docker run -p 9090:8081 book-rest-api-reactjs.jar

现在当我访问端点(http://localhost:9090/rest/books)时,我能够得到结果。

【讨论】:

【参考方案3】:

为了更优雅的方式:过去,docker-maven-plugin 最适合我,这里是预览:

<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>VERSION GOES HERE</version>
    <configuration>
        <imageName>example</imageName>
        <baseImage>java:8</baseImage>
        <entryPoint>["java", "-jar", "/$project.build.finalName.jar"]   </entryPoint>
        <!-- copy the service's jar file from target into the root directory of the image --> 
        <resources>
            <resource>
                <targetPath>/</targetPath>
                <directory>$project.build.directory</directory>
                <include>$project.build.finalName.jar</include>
            </resource>
        </resources>
    </configuration>
</plugin>

除了可以在您的项目中正确构建它之外,还可以将图像直接推送到 docker 注册表:

mvn ... docker:build -DpushImageTags -DdockerImageTag=latest -DdockerImageTag=tag

【讨论】:

以上是关于从 Spring Boot Jar 构建 Docker 映像的主要内容,如果未能解决你的问题,请参考以下文章

Gradle 如何配置构建文件以从同一项目创建 Spring boot jar 和 spring web-mvc war

如何在 IntelliJ IDEA 中为 Spring Boot 项目构建 jar 工件

了解 STS:Spring Boot 应用程序在 STS 中运行良好,但使用 gradle 构建 jar 时,构建失败

从 jar 运行时 CSS 未在 Spring Boot 中加载

Spring Boot 构建可执行 jar 失败

Heroku Spring Boot 不构建 Jar