如何实现Dockerfile继承?

ycggw6v2  于 2024-01-06  发布在  Docker
关注(0)|答案(4)|浏览(194)

我有一个安装生产和测试依赖的Dockerfile。我想有单独的测试镜像,所以生产镜像更小,没有太多的代码重复。也许有像FROM语句引用其他Dockerfile?
Dockerfile有以下几行:

  1. ADD requirements.txt ${PROJECT_DIR}/requirements.txt
  2. RUN pip install --no-cache --process-dependency-links --trusted-host github.com -r requirements.txt
  3. ADD requirements-test.txt ${PROJECT_DIR}/requirements-test.txt
  4. RUN pip install --no-cache --process-dependency-links --trusted-host github.com -r requirements-test.txt

字符串
前两个安装项目依赖项,后两个安装测试依赖项(pytest,pylint等)。
我也有docker-compose来启动数据库,redis缓存等。这是我运行服务和运行测试的方式:

  1. run:
  2. docker-compose -f docker-compose.yaml run
  3. test:
  4. docker-compose -f docker-compose-dev.yaml run py.test tests/


在这两个docker-compose.yaml有这个构建配置为我的容器:

  1. build:
  2. context: .
  3. dockerfile: ./Dockerfile


因此,我可以从docker-compose.yaml引用不同的Dockerfile,但我不希望它们是只有两行差异的完整副本。

nhaq1z21

nhaq1z211#

推荐的方法是多阶段构建:
https://docs.docker.com/develop/develop-images/multistage-build/
也就是说,不要将生产和测试docker文件分开,而是将所有的需求放在一个文件中,然后为你需要的目标阶段构建。
一个示例Dockerfile:

  1. FROM python:3.8.7-slim-buster AS production
  2. ADD requirements.txt ${PROJECT_DIR}/requirements.txt
  3. RUN pip install -r requirements.txt
  4. FROM production AS test
  5. ADD requirements-test.txt ${PROJECT_DIR}/requirements-test.txt
  6. RUN pip install -r requirements-test.txt

字符串
然后为您的生产构建目标选择正确的阶段:

  1. docker build --target production -t org/service:latest .


多阶段构建语法在Docker Engine 17.05中引入。

展开查看全部
nkoocmlb

nkoocmlb2#

FROM是这里的解决方案。生产和开发映像不应该有太大的不同,或者根本不应该有区别,因为我们的想法是部署你已经开发的东西。根据我的经验,从生产映像开始并扩展开发映像更容易,因为开发需要更多的软件,如调试器,编译器等。
由于评论:
dockerfile中,FROM指令接受一个image标签,所以像ubuntu:latest和docker这样的东西会首先尝试在本地找到该图像,然后尝试从repo中拉取它,如果在本地找不到它。
如果您没有存储库,您可以通过运行以下命令在本地创建基础映像:

  1. docker build --tag vendor/production:0.0.1 .

字符串
这将编译图像。然后你可以写:

  1. FROM vendor/production:0.0.1


在你的dev-dockerfile中编译这个。我通常为所有的编译工作创建一个小的bash脚本。

sxpgvts3

sxpgvts33#

如果你不想使用Docker Compose来构建镜像,那么你可以通过两个步骤手动构建它:
Dockerfile.test可能包含:

  1. FROM prod-image
  2. RUN pip install more-dependencies

字符串
然后运行:

  1. docker build -t prod-image .
  2. docker build -t test-image -f Dockerfile.test .


已经说过,最佳实践通常是只有一个映像,并对生产映像运行端到端测试之类的东西。(代码覆盖率工具、单元测试库、模拟对象工厂)I(和我的CI系统)在Docker之外运行它们,但使用相同的代码库。(每次构建),可在面向开发人员、面向测试、预生产和登台环境中运行。

相关问题