首页 > 编程问答 >运行 Github Action 测试 Docker 镜像时退出代码 137

运行 Github Action 测试 Docker 镜像时退出代码 137

时间:2024-07-27 16:37:30浏览次数:14  
标签:python docker github-actions fastapi

我正在学习 Testdriven.io:使用 FastAPI 和 Docker 进行测试驱动开发课程,目前正在学习持续集成部分。在本节中,您将使用 github 操作来构建 docker 映像并运行测试和 linting 等。

在流程的测试 Docker 映像步骤中,当尝试进行 pytest 时,我收到以下错误: 错误:进程已完成并退出代码 137

enter image description here

工作流程 main.yml:

name: Continuous Integration and Delivery

on: [ push ]

env:
  IMAGE: docker.pkg.github.com/$(echo $GITHUB_REPOSITORY | tr '[A-Z]' '[a-z]')/summarizer

jobs:

  build:
    name: Build Docker Image
    runs-on: ubuntu-latest
    steps:
      - name: Checkout master
        uses: actions/[email protected]
      - name: Log in to GitHub Packages
        run: echo ${GITHUB_TOKEN} | docker login -u ${GITHUB_ACTOR} --password-stdin docker.pkg.github.com
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      - name: Pull image
        run: |
          docker pull ${{ env.IMAGE }}:latest || true
      - name: Build image
        run: |
          docker build \
            --cache-from ${{ env.IMAGE }}:latest \
            --tag ${{ env.IMAGE }}:latest \
            --file ./project/Dockerfile.prod \
            "./project"
      - name: Push image
        run: |
          docker push ${{ env.IMAGE }}:latest

  test:
    name: Test Docker Image
    runs-on: ubuntu-latest
    needs: build
    steps:
      - name: Checkout master
        uses: actions/[email protected]
      - name: Log in to GitHub Packages
        run: echo ${GITHUB_TOKEN} | docker login -u ${GITHUB_ACTOR} --password-stdin docker.pkg.github.com
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      - name: Pull image
        run: |
          docker pull ${{ env.IMAGE }}:latest || true
      - name: Build image
        run: |
          docker build \
            --cache-from ${{ env.IMAGE }}:latest \
            --tag ${{ env.IMAGE }}:latest \
            --file ./project/Dockerfile.prod \
            "./project"
      - name: Run container
        run: |
          docker run \
            -d \
            --name fastapi-tdd \
            -e PORT=8765 \
            -e ENVIRONMENT=dev \
            -e DATABASE_TEST_URL=sqlite://sqlite.db \
            -p 5003:8765 \
            ${{ env.IMAGE }}:latest
      - name: Pytest
        run: docker exec fastapi-tdd python -m pytest tests
      - name: Flake8
        run: docker exec fastapi-tdd python -m flake8 .
      - name: Black
        run: docker exec fastapi-tdd python -m black . --check
      - name: isort
        run: docker exec fastapi-tdd python -m isort . --check-only

在本地对 docker 容器运行 pytest 可以工作。我似乎没有可以访问的任何其他日志可以更清楚地说明为什么会发生这种情况。任何帮助,将不胜感激。


退出代码 137 (128 + 9) 表示的 Docker 容器正在被 Linux 内核发送的 SIGKILL 信号终止。这通常发生在容器超出了其分配的内存或 CPU 资源时。

GitHub Actions 默认使用运行器具有有限的资源的资源受限环境。的测试套件可能需要比 GitHub Actions 环境默认提供的资源更多的资源,从而导致 OOM 错误。

可以尝试以下方法来解决此问题:

  1. 增加 GitHub Actions 环境中的资源限制: 可以使用 GitHub Actions 提供的 runs-on 属性来指定更强大的运行器,例如 ubuntu-latest-4cores ubuntu-latest-8cores 。这些运行器提供比默认运行器更多的 CPU 和内存。

    yaml jobs: test: runs-on: ubuntu-latest-4cores

  2. 优化的 Docker 映像和测试:

    • 减少 Docker 映像的大小: 一个更小的映像将消耗更少的内存。使用多阶段构建并尝试使用更精简的基础映像。
    • 优化测试以提高效率: 调查可能导致过度资源使用情况的测试,并进行必要的优化。如果可能,请考虑并行化的测试运行以减少整体执行时间。
    • 为容器设置资源限制: 可以设置 Docker 资源限制,例如内存限制,以防止容器使用过多的系统资源。在 docker run 命令中使用 -m --memory 选项来设置内存限制。

    yaml - name: Run container run: | docker run \ -d \ --name fastapi-tdd \ -e PORT=8765 \ -e ENVIRONMENT=dev \ -e DATABASE_TEST_URL=sqlite://sqlite.db \ -p 5003:8765 \ -m 2g \ # Set memory limit to 2GB ${{ env.IMAGE }}:latest

  3. 在构建步骤中使用缓存依赖项: 如果在测试中安装了依赖项,请确保在构建步骤中缓存依赖项。这将减少测试执行时间,并可能帮助避免资源限制。

  4. 使用自我托管运行器: 如果以上选项都不起作用,可以考虑使用自我托管运行器,可以使用该运行器提供自定义硬件和资源分配以满足的需求。

通过尝试这些解决方案之一或组合,应该能够解决退出代码 137 并成功运行 GitHub Actions 测试。

标签:python,docker,github-actions,fastapi
From: 69693796

相关文章