构建 docker 镜像后 Github runner 磁盘空间不足

Adr*_*ian 3 diskspace docker github-actions

我有两个 github 存储库(称为 A 和 B),它们都有一个.github/workflows/build_and_test.yml看起来几乎与此相同的文件:

name: Build and test

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build-with-docker:
    runs-on: ubuntu-20.04
    steps:
      - uses: actions/checkout@v3
      - uses: docker/setup-buildx-action@v2
      - uses: docker/build-push-action@v3
        with:
          tags: my_tag:latest
          load: true
          context: .
          cache-from: type=gha
          cache-to: type=gha,mode=max

      - run: docker run my_tag pytest
Run Code Online (Sandbox Code Playgroud)

在回购协议A中

  • 我的基础镜像Dockerfiler-base:4.2.1,大约 782MB
  • 我构建的镜像最终约为 1.71GB
  • github 工作流程从头到尾运行得很愉快(图像构建,步骤docker run my_tag pytest运行,一切都很好)

在仓库 B 中

  • 我的基础镜像Dockerfilepytorch/pytorch,大约 5.82GB
  • 我构建的镜像最终约为 6.4GB
  • github 工作流程出现两个问题,一个警告和一个错误,我将在下面描述

警告是You are running out of disk space. The runner will stop working when the machine runs out of disk space. Free space left: 0 MB

错误发生在docker run my_tag pytest步骤中:我得到

Unable to find image 'my_tag:latest' locally
docker: Error response from daemon: pull access denied for my_tag, repository does not exist or may require 'docker login': denied: requested access to the resource is denied.
Run Code Online (Sandbox Code Playgroud)

我怀疑这是一个转移注意力的东西,如果我解决了磁盘空间问题,它就会消失,尽管我不确定。(我怀疑Unable to find image这是一个转移注意力的事情,因为我在仓库 A 中没有收到此错误。)

有没有办法build-push-action在不更改 Dockerfile 的情况下减少存储库 B 中我的步骤使用的磁盘空间?我应该使用https://github.com/docker/build-push-action#inputsno-cache-filters中描述的输入吗?

(可能相关:如何在持续集成中删除旧的 docker 映像以节省磁盘空间,尽管我正在寻找更适合我的 github 工作流程设置的答案。)

根据https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners#supported-runners-and-hardware-resources github 的 Linux 运行器有 14 GB 的 SSD 空间。

更新:我尝试在存储库 B 中添加no-cache: truedocker/build-push-action@v3并且看到与以前完全相同的running out of disk space警告和Unable to find image错误。

令人困惑的是,github UI 旁边有一个复选标记Run docker/build-push-action@v3,这表明该步骤已成功运行,因此我不确定运行程序在哪个确切时间点耗尽磁盘空间:

github工作流程截图

Adr*_*ian 5

感谢https://github.com/actions/runner-images/issues/2840#issuecomment-1284059930,我得到了这个工作。

我的新 github 工作流程 yml 文件是

name: Build Docker image

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build-with-docker:
    runs-on: ubuntu-20.04
    steps:
      - name: Remove unnecessary files
        run: |
          sudo rm -rf /usr/share/dotnet
          sudo rm -rf "$AGENT_TOOLSDIRECTORY"
      - uses: actions/checkout@v3
      - uses: docker/setup-buildx-action@v2
      - uses: docker/build-push-action@v4
        with:
          context: .
          tags: my_tag:latest
          load: true
          cache-from: type=gha
          cache-to: type=gha,mode=max

      - name: Run pytest
        run: docker run my_tag pytest
Run Code Online (Sandbox Code Playgroud)

Remove unnecessary files步骤修复了磁盘空间警告并且Unable to find image错误消失了(所以这确实是一个转移注意力的事情)。


Joã*_*ira 5

OP提供的解决方案很好,但可能还不够。就我而言,由于我有一个很大的 docker 镜像(大约 20G),我不得不删除更多的 APT 软件,并进一步删除.git/签出后创建的目录(通常您不需要将其.git/放入 docker 镜像进行生产)。

我用过这个,现在效果很好

name: Docker build and push

on:
  push:
    branches:
      - "main"

jobs:
  build:
    runs-on: ubuntu-20.04
    steps:
      - 
        name: Check disk space
        run: df . -h
      - 
        name: Free disk space
        run: |
          sudo docker rmi $(docker image ls -aq) >/dev/null 2>&1 || true
          sudo rm -rf \
            /usr/share/dotnet /usr/local/lib/android /opt/ghc \
            /usr/local/share/powershell /usr/share/swift /usr/local/.ghcup \
            /usr/lib/jvm || true
          echo "some directories deleted"
          sudo apt install aptitude -y >/dev/null 2>&1
          sudo aptitude purge aria2 ansible azure-cli shellcheck rpm xorriso zsync \
            esl-erlang firefox gfortran-8 gfortran-9 google-chrome-stable \
            google-cloud-sdk imagemagick \
            libmagickcore-dev libmagickwand-dev libmagic-dev ant ant-optional kubectl \
            mercurial apt-transport-https mono-complete libmysqlclient \
            unixodbc-dev yarn chrpath libssl-dev libxft-dev \
            libfreetype6 libfreetype6-dev libfontconfig1 libfontconfig1-dev \
            snmp pollinate libpq-dev postgresql-client powershell ruby-full \
            sphinxsearch subversion mongodb-org azure-cli microsoft-edge-stable \
            -y -f >/dev/null 2>&1
          sudo aptitude purge google-cloud-sdk -f -y >/dev/null 2>&1
          sudo aptitude purge microsoft-edge-stable -f -y >/dev/null 2>&1 || true
          sudo apt purge microsoft-edge-stable -f -y >/dev/null 2>&1 || true
          sudo aptitude purge '~n ^mysql' -f -y >/dev/null 2>&1
          sudo aptitude purge '~n ^php' -f -y >/dev/null 2>&1
          sudo aptitude purge '~n ^dotnet' -f -y >/dev/null 2>&1
          sudo apt-get autoremove -y >/dev/null 2>&1
          sudo apt-get autoclean -y >/dev/null 2>&1
          echo "some packages purged"
      - 
        name: Check disk space
        run: |
          sudo dpkg-query -Wf '${Installed-Size}\t${Package}\n' | sort -nr | head
          df . -h
          sudo du /usr/ -hx -d 4 --threshold=1G | sort -hr | head
      -
        name: Checkout
        uses: actions/checkout@v3
      - 
        name: Check working space directory
        run: du ${GITHUB_WORKSPACE} -h -d 1
      - 
        name: Get more space
        run: |
          df . -h
          sudo rm -rf ${GITHUB_WORKSPACE}/.git
          df . -h
      -
        name: Login to Docker Hub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}
      -
        name: Build and push
        uses: docker/build-push-action@v4
        with:
          context: .
          file: ./Dockerfile
          push: true
          tags: ${{ secrets.DOCKER_USERNAME }}/my-app:latest

Run Code Online (Sandbox Code Playgroud)