使用 GitHub Actions 构建 Docker 镜像:没有这样的文件或目录

Sti*_*ian 3 docker github-actions

我们打算使用 Git Actions 在每次提交时构建 Docker。

这是我们当前的 Git Actions yml:

# This is a basic workflow to help you get started with Actions

name: CI

# Controls when the workflow will run
on:
  push:
    branches: 
      - '**'
  pull_request:
    branches:
      - '**'

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:

  docker-build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      
      - name: Navigate to app folder
        run: cd app
      - name: Open Directory
        working-directory: app
        run: |
          ls -la
      - name: Build docker image
        run: docker build . -t app_name -f Dockerfile
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat /home/runner/work/git-root/app/Dockerfile: no such file or directory
Run Code Online (Sandbox Code Playgroud)

但在我的ls -lai 中看到 Dockerfile 存在:

total 48
drwxr-xr-x 4 runner docker 4096 Sep 15 13:03 .
drwxr-xr-x 6 runner docker 4096 Sep 15 13:03 ..
-rw-r--r-- 1 runner docker   93 Sep 15 13:03 .env-template
-rw-r--r-- 1 runner docker  655 Sep 15 13:03 Dockerfile
Run Code Online (Sandbox Code Playgroud)

我努力了:

  • 同时使用actions/checkout@v1actions/checkout@v2
  • cd 进入包含 Dockerfile 的目录
  • 将 Dockerfile 目录设置为工作目录

为什么 docker 构建找不到我的 Dockerfile?

Ben*_* W. 6

请参阅此处的文档:

每个run关键字代表运行器环境中的一个新进程和 shell。当您提供多行命令时,每一行都在同一个 shell 中运行。

这意味着该步骤之后工作目录不会保留cd。您的ls步骤有效,因为您明确为其设置了工作目录。

您必须cd在与构建命令相同的运行步骤中:

      - name: Build docker image
        run: |
          cd app
          docker build . -t app_name -f Dockerfile
Run Code Online (Sandbox Code Playgroud)

或者你可以设置一个工作目录:

      - name: Build docker image
        working-directory: ./app
        run: docker build . -t app_name -f Dockerfile
Run Code Online (Sandbox Code Playgroud)

或者您可以为 docker 提供 dockerfile 的路径:

      - name: Build docker image
        run: docker build app -t app_name
Run Code Online (Sandbox Code Playgroud)

默认值为-fPATH/Dockerfile其中PATH如上app