我的Python项目作为容器部署,并且也有单元测试。对于Docker的最佳实践,最终映像应该排除任何仅用于测试的依赖项(例如pytest
)。在运行测试的同时,如何排除测试依赖项?
一个问题是,如果我独立于我的部署映像构建我的测试环境,那么这两个环境可能最终包含子依赖的不同版本。(假设我的项目使用rasterio
,而rasterio
和pytest
都使用attrs
,那么安装pytest
可以改变包管理器安装的attrs
的版本。这表明错误可能出现在部署映像中,而没有出现在测试环境中。)如果测试依赖项包含在最终的映像中,那么CI可以通过像docker-compose build
、docker-compose up -d
和docker-compose exec myimage pytest
这样的连续步骤来设置。如果测试依赖项是而不是在最终的容器环境中,CI工作流应该如何安排?(例如,如果我使用多阶段docker构建并在第二阶段之前运行单元测试,我是否需要手动维护一列子依赖项以进入最后阶段?)
如何配置docker
gist
如何使用配置
# no dev-packages
docker build -t release .
# dev-packages + test config
docker build -t test-image --target=test .
# dev-packages + release config
docker build -t dev-image --build-args APP_ENV=dev .
如何获取requirements.txt和requirements-dev.txt
使用pipenv或poetry来管理general和develop包。使用pipenv:
pipenv install django
pipenv install --dev pytest
pipenv lock -r > requirements.txt
pipenv lock -r --dev > requirements-dev.txt
知识来源:链接