在我的 Django 项目中,我有 psql/postgis 数据库引擎。要运行测试,我需要 testdb 具有相同的配置。因此,我对存储库进行了 docker 设置,从而使项目启动并运行。我在 docker-compose.yml 中有 django 服务器和 postgis 数据库。
# docker-compose.yml
version: '3.0'
services:
db:
image: postgis/postgis:16-3.4
container_name: docker_db
environment:
- POSTGRES_DB=test
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
ports:
- '5432:5432'
expose:
- 5432
test-web:
build: .
container_name: docker_web
command:
sh -c "python manage.py migrate &&
python manage.py runserver 0.0.0.0:8000"
volumes:
- .:/code
ports:
- 8000:8000
environment:
- POSTGRES_PORT=5432
- POSTGRES_HOST=db
- POSTGRES_DATABASE=test
- POSTGRES_USERNAME=postgres
- POSTGRES_PASSWORD=postgres
- PYTHONUNBUFFERED=1
depends_on:
- db
# Dockerfile
FROM python:3.10
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
WORKDIR /code
RUN apt-get update && apt install -y postgis aptitude && apt-get update && aptitude install -y gdal-bin libgdal-dev python3-gdal binutils libproj-dev
RUN pip install poetry
COPY . /code/
RUN poetry config virtualenvs.create false \
&& poetry install --no-root
# .github\workflows\tests.yml
name: Pytest
on:
push:
pull_request:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: docker-compose up
env:
COMPOSE_INTERACTIVE_NO_CLI: 1
run: docker-compose up -d
- name: Check running containers
run: docker ps -a
- name: Check logs
run: docker-compose logs
- name: Test with pytest
run: docker exec docker_web bash -c "pytest"
我以相同的顺序在本地触发这些命令,并且工作正常。 Pytest找到测试文件并测试成功。 (当然,运行 pytest 也可以在没有 docker 的情况下运行。但我需要这个来进行 github 操作。)
`docker-compose up -d`
`docker exec docker_web bash -c "pytest"`
现在,我在这个设置中遇到的问题是在 github actions 中。 Github actions 给出
Error: Process completed with exit code 137.
,这意味着进程由于内存不足而被终止。我也尝试使用单个文件运行 pytest,但错误仍然相同。
有人可以告诉,这种方法是否正确。或者解决内存问题的任何替代方法。 或者在 github actions 的容器内运行 pytest 的任何替代方法。
错误:进程已完成,退出代码为 137
显然,测试是在后台启动 docker compose 后立即运行的。在运行测试之前,没有什么可以确保所有容器都已启动并运行。根据机器规格,运行测试时容器可能会或可能不会启动。
最有可能的是,出现退出代码 137 是因为一旦工作流的其余部分完成,容器(在启动时)就会被终止。您可以从工作流程运行日志中验证这一点。
docker compose up
支持 --wait
和 --wait-timeout
标志来处理这种情况。