java - 离线使用 jib maven 插件构建 docker 容器的问题

标签 java spring-boot docker maven-plugin jib

我正在关注 here 的 Spring Boot Docker 教程.

我在有互联网连接时得到了确切的结果。现在我需要在没有互联网连接的环境中产生相同的结果。我将 Maven 存储库和 docker 镜像复制到新环境中。我很确定 maven 和 docker 已启动并正在运行。

当我尝试运行以下命令 com.google.cloud.tools:jib-maven-plugin:dockerBuild -Dimage=eureka 时,我收到错误消息。我猜有一些文件插件无法找到,但不确定是哪些。

我正在添加错误消息

[INFO] Scanning for projects...
[INFO]
[INFO] ---------------------------< com.ays:eureka >---------------------------
[INFO] Building eureka 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- jib-maven-plugin:2.1.0:dockerBuild (default-cli) @ eureka ---
[INFO]
[INFO] Containerizing application to Docker daemon as eureka...
[WARNING] Base image 'gcr.io/distroless/java:8' does not use a specific image digest - build may not be reproducible
[ERROR] I/O error for image [gcr.io/distroless/java]:
[ERROR]     org.apache.http.conn.ConnectTimeoutException
[ERROR]     Connect to gcr.io:443 [gcr.io/64.233.184.82] failed: connect timed out
[INFO] Executing tasks:
[INFO] [============                  ] 40,0% complete
[INFO] > building image to Docker daemon
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  22.409 s
[INFO] Finished at: 2020-04-13T16:37:23+03:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal com.google.cloud.tools:jib-maven-plugin:2.1.0:dockerBuild (default-cli) on project eureka: Connect to gcr.io:443 [gcr.io/64.233.184.82] failed: connect timed out -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException 

有人可以指出我应该看哪里吗?或者现在我还缺少什么吗?

这是我的 DockerFile

FROM openjdk:8-jdk-alpine
RUN addgroup -S spring && adduser -S spring -G spring
USER spring:spring
ARG DEPENDENCY=target/dependency
COPY ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY ${DEPENDENCY}/META-INF /app/META-INF
COPY ${DEPENDENCY}/BOOT-INF/classes /app
ENTRYPOINT ["java","-cp","app:app/lib/*","hello.Application"]`

我没有更改 DockerFile 中的任何内容。

最佳答案

如果不指定基础镜像,Jib 3.0+ by default uses adoptopenjdk:8-jre 作为 Java 8 应用程序的基础镜像。 (在 3.0 之前,Jib 使用 gcr.io/distroless/java:8 作为默认值。)

当您不使用特定图像摘要(例如 gcr.io/distroless/java@sha256:... )而是使用标签(在 Jib < 3.0 的情况下使用 :8 )作为基础图像时,随着时间的推移,该标签可能会指向不同的图像。也就是说,如果您稍后在另一台机器上构建镜像,Jib 可能会选择与您之前使用的略有不同的基础镜像。因此出现以下警告:

[WARNING] Base image 'gcr.io/distroless/java:8' does not use a specific image digest - build may not be reproducible

因此,当您不使用摘要时,Jib 会访问注册表 ( gcr.io ) 并检查本地缓存的镜像(不在本地 Docker 引擎缓存中,而是在 Jib 自己的缓存中)是否是最新的。如果没有,Jib 将下载更新的镜像。这就是您在离线时收到错误的原因。

您有两个选择。

  1. 密码 --offline在命令行上转到 Maven。然后,Jib将使用缓存的基础镜像;将不会有在线连接。当然,为了实现这一点,Jib 之前应该已经缓存了基础镜像;您需要事先在线运行 Jib 至少一次。

  2. 使用摘要来确定特定的基础镜像。例如,在您的pom.xml中,

    <configuration>
      <from><image>adoptopenjdk@sha256:9cb8bc7356ec2d9de56f3be3d8204a846ca0a3220af059aa67c35d53c7138e17</image></from>
    </configuration>
    

    如果您愿意,您可以指定标签和摘要。但是,在这种情况下,该标记将不起作用,仅充当注释。

    <from><image>adoptopenjdk:8-jre@sha256:9cb8bc7356ec2d9de56f3be3d8204a846ca0a3220af059aa67c35d53c7138e17</image></from>
    

    要了解要使用的摘要,请检查 adoptopenjdk Docker Hub repository 。另一种方法是在线运行 Jib。警告之后,您将看到一条消息,报告该标记的当前摘要。

    [WARNING] Base image 'adoptopenjdk:8-jre' does not use a specific image digest - build may not be reproducible
    [INFO] Using base image with digest: sha256:9cb8bc7356ec2d9de56f3be3d8204a846ca0a3220af059aa67c35d53c7138e17
    

运行本地 Docker 守护进程时的另一个选项是通过添加前缀 docker:// 让 Jib 使用守护进程中的镜像。到基础镜像(例如 <image>docker://openjdk:11-jre-slim</image> )。但是,根据具体情况,这可能比使用远程基础镜像慢一点(但即使在这种情况下也可能慢不了多少)。

<小时/>

最后,您可以删除您的 Dockerfile . Jib 不使用 Dockerfile 、Docker CLI 或 Docker 守护进程。

关于java - 离线使用 jib maven 插件构建 docker 容器的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61189237/

相关文章:

java - 如何编写一个junit测试来在操作之间插入双向链表?

java - 简单XML : Add attributes to primitives

java - index.html 未显示(不支持请求方法 'GET')

docker - Docker,Visual Studio 2019和共享文件夹

shell - 是否可以在 1 天后自动删除正在运行的容器?

java - 如何在Aspose Java中从Word文档中删除特定页面?

java - Docker tomcat找不到应用程序日志

java - 如何获取两个日期之间的数据 REST Spring

java - 如何模拟 REST 模板交换?

docker - 仅在使用缓存的某个步骤之前重新运行 Docker?