【问题标题】:Automated Spring boot Docker Image failed to build on docker hub when connected to github/bitbucket repository连接到 github/bitbucket 存储库时,自动 Spring boot Docker Image 无法在 docker hub 上构建
【发布时间】:2019-12-24 01:11:00
【问题描述】:

我的 Spring Boot 中有一个简单的 Dockerfile,如下所示。我能够在本地成功构建映像,并且可以使用我的凭据进行推送。

但是每次尝试自动构建时,我的构建都会失败。

FROM openjdk:8-jdk-alpine
LABEL maintainer="xxxxx@xxx.com"
VOLUME /tmp
EXPOSE 8080
ARG JAR_FILE=target/jollof.jar
ADD ${JAR_FILE} jollof.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","- 
jar","/jollof.jar"]

从 docker hub,我从日志中得到了这个。

Building in Docker Cloud's infrastructure...
Cloning into '.'...
Warning: Permanently added the RSA host key for IP address 'xxx.xx.xxx.xxx' to 
the list of known hosts.
....
....
Step 6/7 : ADD ${JAR_FILE} jollof.jar
ADD failed: stat /var/lib/docker/tmp/docker- 
  builder674045875/target/jollof.jar: 
no such file or directory

【问题讨论】:

  • 这和编程有关系吗?我的意思是我无法理解。
  • @GauravMall yes ...代码部署,或者称之为devOps。
  • 哦,是的,您使用的是BitBucket。没注意到:)

标签: java spring-boot docker bitbucket devops


【解决方案1】:

与您的本地环境不同,Docker Hub 获取然后在新环境中构建您的项目,因此要复制的文件 target/jollof.jar 在 docker 上下文中不可用。因此,您观察到的错误。

所以我建议重构您的Dockerfile,以便在Dockerfile 本身中完成mvn package 左右(为了可重复性,这是采用的最佳实践)。请注意,此配置将适用于 Docker Hub 的自动构建以及本地环境中的构建。

例如,下面是一个示例 Dockerfile,其灵感来自此 SO 答案 How to convert a Spring-Boot web service into a Docker image? 以及您帖子的 Dockerfile

FROM maven:3.6-jdk-8 as maven
WORKDIR /app
COPY ./pom.xml ./pom.xml
RUN mvn dependency:go-offline -B
COPY ./src ./src

# TODO: jollof-* should be replaced with the proper prefix
RUN mvn package && cp target/jollof-*.jar app.jar

# Rely on Docker's multi-stage build to get a smaller image based on JRE
FROM openjdk:8-jre-alpine
LABEL maintainer="xxxxx@xxx.com"
WORKDIR /app
COPY --from=maven /app/app.jar ./app.jar

# VOLUME /tmp  # optional
EXPOSE 8080    # also optional

ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/app.jar"]

【讨论】:

  • @ErkMD 我完全错过了构建项目的 maven 部分,但我认为 docker 的想法是在任何地方都以相同的方式工作......为什么它在我的本地环境中工作?它可以访问我的本地 maven 安装吗?
  • @IntegralMaster 一旦构建,Docker 镜像确实确保了可移植性。但是从同一个 Dockerfile 构建的 2 个图像具有不同的输入(例如,您的代码库的 2 个不同版本)总是不同的,甚至无法编译。总而言之,当您执行docker build -t image-name . 时,最后一个参数(此处为当前文件夹.)表示所谓的Docker 构建上下文(当您使用命令COPY 或@987654333 时Docker 可以从中检索文件的参考文件夹@)。所以如果你做ADD target/jollof.jar jollof.jar,不管./target/jollof.jar是否存在,结果都会不同。
  • 我现在明白了。基本上,我在本地构建之前已经运行了“mvn clean install”,这创建了一个 ./target/jollof.jar 并且 docker hub 上缺少这个文件夹。
猜你喜欢
  • 2019-04-12
  • 1970-01-01
  • 1970-01-01
  • 2015-11-15
  • 2016-06-06
  • 1970-01-01
  • 2018-06-29
  • 1970-01-01
  • 2021-01-24
相关资源
最近更新 更多