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

7jmck4yq  于 4个月前  发布在  Spring
关注(0)|答案(1)|浏览(51)

Sping Boot Docker从here开始
我在有互联网连接的情况下得到了确切的结果。现在我需要在没有互联网连接的环境中产生同样的结果。我将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中做任何更改。

edqdpe6u

edqdpe6u1#

如果不指定基础映像,则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。
1.使用摘要来确定特定的基础映像。例如,在pom.xml中,

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


如果你愿意的话,你可以同时指定tag和digest。但是,在这种情况下,tag没有任何作用,只作为一个注解。

<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://前缀添加到基础镜像(例如,<image>docker://openjdk:11-jre-slim</image>)来使Jib使用来自守护进程的镜像。然而,根据情况,这可能比使用远程基础镜像慢一点(但即使在这种情况下也可能不会太慢)。
最后,* 您可以删除Dockerfile。* Jib不使用Dockerfile、Docker CLI或Docker守护程序。

相关问题