我有一个安装生产和测试依赖的Dockerfile。我想有单独的测试镜像,所以生产镜像更小,没有太多的代码重复。也许有像FROM
语句引用其他Dockerfile?
Dockerfile有以下几行:
ADD requirements.txt ${PROJECT_DIR}/requirements.txt
RUN pip install --no-cache --process-dependency-links --trusted-host github.com -r requirements.txt
ADD requirements-test.txt ${PROJECT_DIR}/requirements-test.txt
RUN pip install --no-cache --process-dependency-links --trusted-host github.com -r requirements-test.txt
字符串
前两个安装项目依赖项,后两个安装测试依赖项(pytest,pylint等)。
我也有docker-compose来启动数据库,redis缓存等。这是我运行服务和运行测试的方式:
run:
docker-compose -f docker-compose.yaml run
test:
docker-compose -f docker-compose-dev.yaml run py.test tests/
型
在这两个docker-compose.yaml
有这个构建配置为我的容器:
build:
context: .
dockerfile: ./Dockerfile
型
因此,我可以从docker-compose.yaml
引用不同的Dockerfile,但我不希望它们是只有两行差异的完整副本。
4条答案
按热度按时间nhaq1z211#
推荐的方法是多阶段构建:
https://docs.docker.com/develop/develop-images/multistage-build/
也就是说,不要将生产和测试docker文件分开,而是将所有的需求放在一个文件中,然后为你需要的目标阶段构建。
一个示例Dockerfile:
字符串
然后为您的生产构建目标选择正确的阶段:
型
多阶段构建语法在Docker Engine 17.05中引入。
nkoocmlb2#
FROM
是这里的解决方案。生产和开发映像不应该有太大的不同,或者根本不应该有区别,因为我们的想法是部署你已经开发的东西。根据我的经验,从生产映像开始并扩展开发映像更容易,因为开发需要更多的软件,如调试器,编译器等。由于评论:
在
dockerfile
中,FROM
指令接受一个image标签,所以像ubuntu:latest
和docker这样的东西会首先尝试在本地找到该图像,然后尝试从repo中拉取它,如果在本地找不到它。如果您没有存储库,您可以通过运行以下命令在本地创建基础映像:
字符串
这将编译图像。然后你可以写:
型
在你的
dev-dockerfile
中编译这个。我通常为所有的编译工作创建一个小的bash脚本。sxpgvts33#
如果你不想使用Docker Compose来构建镜像,那么你可以通过两个步骤手动构建它:
Dockerfile.test
可能包含:字符串
然后运行:
型
已经说过,最佳实践通常是只有一个映像,并对生产映像运行端到端测试之类的东西。(代码覆盖率工具、单元测试库、模拟对象工厂)I(和我的CI系统)在Docker之外运行它们,但使用相同的代码库。(每次构建),可在面向开发人员、面向测试、预生产和登台环境中运行。
pgky5nke4#
There is an issue in github regarding what you want