我正在使用 docker-compose 设置测试基础设施。我想使用 docker-compose 选项
--exit-code-from
从正在运行测试的容器返回退出代码。不过,我还有一个容器,可以使用sequelize cli 在我的数据库容器上运行迁移。迁移完成后,此迁移容器将以代码 0 退出,然后运行我的测试。这会导致 --exit-code-from
和 --abort-on-container-exit
选项出现问题。有没有办法在迁移容器退出时忽略?
请勿使用
docker-compose up
运行一次性任务。使用 docker-compose run
代替,如文档所示:
docker-compose run 命令用于运行“一次性”或“临时”任务。它需要您要运行的服务名称,并且仅启动正在运行的服务所依赖的服务的容器。使用 run 运行测试或执行管理任务,例如删除数据或将数据添加到数据卷容器。 run 命令的作用类似于 docker run -ti,它打开容器的交互式终端并返回与容器中进程的退出状态匹配的退出状态。
来源:https://docs.docker.com/compose/faq/
例如:
docker-compose build my_app
docker-compose run db_migrations # this starts the services it depends on, such as the db
docker-compose run my_app_tests
--exit-code-from
意味着 --abort-on-container-exit
,根据 文档
--abort-on-container-exit 如果任何容器被停止,则停止所有容器。
但是你可以尝试:
docker inspect <container ID> --format='{{.State.ExitCode}}'
您可以使用
获取所有(包括已停止)容器的列表docker container ls -a
这是一个很好的示例:检查已停止容器的退出代码
我认为在 docker compose 中等待特定容器退出的一种侵入性较小且更简单的方法是使用 healthcheck 选项,而不是从迁移容器中退出 0。即使您的服务本身没有实现运行状况检查,也可以完成此操作。它之所以有效,是因为您的临时迁移容器永远不会退出。 这是一个示例,不需要外部监控,无需重建容器即可应用,当测试容器退出时,迁移将运行并且 compose 将关闭:
services:
longrunningservice:
...
migration:
image: migrationImage
entrypoint: >
/bin/sh -c '
echo "notready" > /tmp/health_status;
runMyMigrationScriptHere();
echo "ready" > /tmp/health_status;
sleep infinity;
'
healthcheck:
test: ["CMD", "cat", "/tmp/health_status", "|", "grep", "ready"]
interval: 1s
timeout: 2s
retries: 10
test:
build: ./vitest
working_dir: /app
depends_on:
- longrunningservice
- migration
docker-compose up --abort-on-container-exit