繁体   English   中英

docker-compose:使用多个Dockerfiles进行多种服务

[英]docker-compose: using multiple Dockerfiles for multiple services

我正在使用docker-compose,我想为不同的服务构建步骤使用不同的Dockerfiles。 文档似乎建议将不同的Dockerfiles放在不同的目录中,但我希望它们都在同一个目录中(并且可能使用以下约定进行区分:Dockerfile.postgres,Dockerfile.main ...)。 这可能吗?

编辑:我有的场景包含这个docker-compose文件:

main:
  build: .
  volumes:
    - .:/code
  environment:
    - DEBUG=true

postgresdb:
  extends:
    file: docker-compose.yml
    service: main
  build: utils/sql/
  ports:
    - "5432"
  environment:
    - DEBUG=true

postgresdb的Dockerfile是:

FROM postgres

# http://www.slideshare.net/tarkasteve/developerweek-2015-docker-tutorial
ADD make-db.sh /docker-entrypoint-initdb.d/

主要是:

FROM python:2.7

RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/

RUN pip install --upgrade pip
RUN pip install -r requirements.txt
ADD . /code/

这现在可行,但我想通过调用Python脚本来扩展postgresdb的Dockerfile,该脚本根据基于SQL Alchemy构建的模型在数据库中创建表(Python脚本将被称为python manage.py create_tables )。 我想将它添加到db的Dockerfile中,但是由于容器的隔离,我不能在那里使用SQL Alchemy,因为该图像基于postgres图像而不是Python,并且它不包含sqlalchemy包。 。

我能做什么? 我尝试在postgresdb使用main服务,但不幸的是它没有携带python及其包,所以我仍然无法编写一个Dockerfile来创建Postgres数据库(通过shell脚本)及其表(通过Python脚本)。

由于Docker处理构建上下文的方式,这是不可能的。

您必须在每个目录中使用并放置Dockerfile ,该目录将成为服务的Docker构建上下文的一部分。

请参阅: Dockerfile

实际上你需要一个看起来像这样docker-compose.yml

service1:
    build: service1

service2:
    build: service2

请参阅: docker-compose

更新:

为了解决您的特定用例 - 虽然我了解您正在尝试做什么,以及为什么我个人不会自己这样做。 隔离是一件好事 ,有助于管理期望和复杂性。 我会将“数据库创建”作为另一个基于应用程序源代码的容器或在应用程序容器本身内执行。

或者,您可以查看更多脚本和模板驱动的解决方案,例如shutit我没有经验,但听过上帝的说法 )。

FWIW:关注点分离ftw :)

你必须在构建部分添加它。 因此,您可以为每个服务指定不同的替代dockerfiles。

services:
  service1:
    build:
        context: .
        args:
            - NODE_ENV=local
        dockerfile: Dockerfile_X
    ports:
        - "8765:8765"

ShutIt的创造者在这里。 很高兴听到人们听到有关它的好消息。

说实话,在你的位置我会编写你自己的Dockerfile并使用标准的包管理,比如apt或yum。 可以免费使用ubuntu图像和python-pip以及python-sqlalchemy进行快速检查。

有更复杂的解决方案可以使用ShutIt为您工作,很高兴离线讨论,因为我认为这有点偏离主题。 ShutIt是为这种用例编写的,因为我可以看到,这是一个常见的问题,因为Dockerfiles在微服务空间之外的实用性有限。

您可以在dockerfile docker-compose.yml使用dockerfile参数为特定服务指定备用参数。

我不知道它何时被添加,因为讨论已经过时了,但您可以在参考https://docs.docker.com/compose/compose-file/#dockerfile中看到它

我昨天试过了,它和我一起工作。 它是我的项目的基础目录我有DockerfileDockerfile-service3 Dockerfile ,并在docker-compose.yml

version: '2'

services:
    service1:
        build:
            context: .
            args:
                - NODE_ENV=local
        ports:
            - "8765:8765"
        # other args skipped for clarity
    service2:
        build:
            context: .
            args:
                - NODE_ENV=local
        ports:
            - "8766:8766"
        # other args skipped for clarity
    service3:
        build:
            context: .
            dockerfile: Dockerfile-service3
            args:
                - NODE_ENV=local
        ports:
            - "8767:8767"
        # other args skipped for clarity
    service4:
        build:
            context: .
            args:
                - NODE_ENV=local
        ports:
            - "8768:8768"
        # other args skipped for clarity

通过这种方式,除了所有的服务, service3将使用标准来建造的Dockerfileservice3将使用内置Dockerfile-service3

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM