【问题标题】:Github Action to maven build followed by Docker build pushGithub Action 到 Maven 构建,然后是 Docker 构建推送
【发布时间】:2020-08-06 21:03:43
【问题描述】:

我是 GitHub Actions 的新手。我有以下 DockerFile

FROM openjdk:8-jdk-alpine
RUN addgroup -S spring && adduser -S spring -G spring
USER spring:spring
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

我正在尝试使用 GitHub Action Publish Docker 以下是我的操作代码

name: Publish Docker
on: [push]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@master
    - name: Publish to Registry
      uses: elgohr/Publish-Docker-Github-Action@master
      with:
        name: myDocker/repository
        username: ${{ secrets.DOCKER_USERNAME }}
        password: ${{ secrets.DOCKER_PASSWORD }}

构建失败并出现以下错误

Step 5/6 : COPY ${JAR_FILE} app.jar
COPY failed: no source files were specified

我认为它无法获取目标文件夹下的 jar 文件。我是否应该在 docker build 之前为 Maven Build 添加另一个步骤,确保使用 Jar 生成目标文件夹。

我更新了我的操作如下但同样的错误

name: Build and push Docker images

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Set up JDK 1.8
        uses: actions/setup-java@v1
        with:
          java-version: 1.8
      - name: Build with Maven
        run: mvn -B package --file pom.xml
      - uses: actions/checkout@master
      - name: Publish to Registry
        uses: elgohr/Publish-Docker-Github-Action@master
        with:
          name: vinodjayachandran/spring-boot-docker
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

具体代码请参考我在 git 上的 repo:https://github.com/vinodjayachandran/spring-boot-docker/

【问题讨论】:

    标签: docker github-actions


    【解决方案1】:

    解决方案是进行多阶段 docker 构建。本质上是从 DockerFile 而不是从 GitHub Actions 进行 maven 构建。

    我的最终 DockerFile

    #
    # Build stage
    #
    FROM maven:3.6.0-jdk-11-slim AS build
    COPY src /home/app/src
    COPY pom.xml /home/app
    RUN mvn -f /home/app/pom.xml clean package
    
    #
    # Package stage
    #
    FROM openjdk:11-jre-slim
    COPY --from=build /home/app/target/*.jar /usr/local/lib/app.jar
    EXPOSE 8080
    ENTRYPOINT ["java","-jar","/usr/local/lib/app.jar"]
    

    GitHub 操作:

    name: Build and push Docker images
    
    on:
      push:
        branches: [ master ]
      pull_request:
        branches: [ master ]
    
    jobs:
      build:
        runs-on: ubuntu-latest
        steps:
        - uses: actions/checkout@master
        - name: Publish to Registry
          uses: elgohr/Publish-Docker-Github-Action@master
          with:
            name: vinodjayachandran/spring-boot-docker
            username: ${{ secrets.DOCKER_USERNAME }}
            password: ${{ secrets.DOCKER_PASSWORD }}
    

    【讨论】:

      【解决方案2】:

      一切看起来都不错,但你必须改变;

      FROM openjdk:8-jdk-alpine
      RUN addgroup -S spring && adduser -S spring -G spring
      USER spring:spring
      ENV JAR_FILE=*.jar
      COPY ${JAR_FILE} app.jar
      ENTRYPOINT ["java","-jar","/app.jar"]
      

      你会看到下面的工作。

      docker build -t deneme:latest .
      Sending build context to Docker daemon   2.56kB
      Step 1/6 : FROM openjdk:8-jdk-alpine
       ---> a3562aa0b991
      Step 2/6 : RUN addgroup -S spring && adduser -S spring -G spring
       ---> Using cache
       ---> ae235df4b0a2
      Step 3/6 : USER spring:spring
       ---> Using cache
       ---> 9ac909bf6b8c
      Step 4/6 : ENV JAR_FILE=target/*.jar
       ---> Running in 7c8948d44b63
      Removing intermediate container 7c8948d44b63
       ---> a26f368cfdba
      Step 5/6 : COPY ${JAR_FILE} app.jar
      COPY failed: no source files were specified
      root@servet:~/denem# ls
      app.jar  Dockerfile
      root@servet:~/denem# nano Dockerfile
      root@servet:~/denem# docker build -t deneme:latest .
      Sending build context to Docker daemon   2.56kB
      Step 1/6 : FROM openjdk:8-jdk-alpine
       ---> a3562aa0b991
      Step 2/6 : RUN addgroup -S spring && adduser -S spring -G spring
       ---> Using cache
       ---> ae235df4b0a2
      Step 3/6 : USER spring:spring
       ---> Using cache
       ---> 9ac909bf6b8c
      Step 4/6 : ENV JAR_FILE=*.jar
       ---> Running in a78dfae771a0
      Removing intermediate container a78dfae771a0
       ---> bdd4cab1bd9c
      Step 5/6 : COPY ${JAR_FILE} app.jar
       ---> 9bec1d061268
      Step 6/6 : ENTRYPOINT ["java","-jar","/app.jar"]
       ---> Running in c23f2ddb682b
      Removing intermediate container c23f2ddb682b
       ---> e24407464a2b
      Successfully built e24407464a2b
      Successfully tagged deneme:latest
      

      【讨论】:

      • 我用 ENV JAR_FILE=*.jar 替换了 ARG JAR_FILE=target/*.jar 但仍然遇到同样的错误。我们是否需要 github 操作中的 maven 构建步骤?参考我的 Github 仓库github.com/vinodjayachandran/spring-boot-docker
      • 但是我没有看到任何 jar 文件如果你可以分享完整的项目我可以解决错误
      • Jar 文件不作为 repo 的一部分存在。当 Maven 构建成功时,jar 将在目标文件夹中创建。是不是不能先做maven build,然后在成功构建的时候拿jar来做docker push?
      猜你喜欢
      • 2021-09-30
      • 2018-08-18
      • 2020-03-13
      • 2021-04-25
      • 1970-01-01
      • 2020-10-28
      • 2023-02-20
      • 2018-10-23
      • 2020-03-21
      相关资源
      最近更新 更多