我正在学习 Testdriven.io:使用 FastAPI 和 Docker 进行测试驱动开发课程,目前正在学习持续集成部分。在本节中,您将使用 github 操作来构建 docker 映像并运行测试和 linting 等。
在流程的测试 Docker 映像步骤中,当尝试进行 pytest 时,我收到以下错误: 错误:进程已完成并退出代码 137
工作流程 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 错误。
可以尝试以下方法来解决此问题:
-
增加 GitHub Actions 环境中的资源限制: 可以使用 GitHub Actions 提供的
runs-on
属性来指定更强大的运行器,例如ubuntu-latest-4cores
或ubuntu-latest-8cores
。这些运行器提供比默认运行器更多的 CPU 和内存。yaml jobs: test: runs-on: ubuntu-latest-4cores
-
优化的 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
-
在构建步骤中使用缓存依赖项: 如果在测试中安装了依赖项,请确保在构建步骤中缓存依赖项。这将减少测试执行时间,并可能帮助避免资源限制。
-
使用自我托管运行器: 如果以上选项都不起作用,可以考虑使用自我托管运行器,可以使用该运行器提供自定义硬件和资源分配以满足的需求。
通过尝试这些解决方案之一或组合,应该能够解决退出代码 137 并成功运行 GitHub Actions 测试。
标签:python,docker,github-actions,fastapi From: 69693796