docker-compose:为多个服务使用多个Dockerfiles

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

编辑:我有的场景包含这个docker组成的文件:

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/ 

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

我能做什么? 我试图使用postgresdbmain服务,但不幸的是它不包含python及其包,所以我仍然不能编写一个Dockerfile来创buildPostgres数据库(通过shell脚本)以及它的表(通过Python脚本)。

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

你将不得不在每个目录中使用DockerfileDockerfile将成为服务的Docker构build上下文的一部分。

请参阅: Dockerfile

您实际上需要一个如下所示docker-compose.yml

 service1: build: service1 service2: build: service2 

请参阅: docker-compose

更新:

解决你的特定用例 – 虽然我明白你想要做什么,为什么我个人不会这样做自己。 隔离是一件好事 ,有助于pipe理期望和复杂性。 我会执行“数据库创build”作为另一个容器基于您的应用程序的源代码或在应用程序容器本身。

或者,你可以看看更多的脚本和模板驱动的解决scheme,如shutit ( 我没有任何经验,但听到神的行事 )。

FWIW:分离关注ftw 🙂

ShutIt的创build者。 满意地听到人们正在听到关于它的好事。

说实话,在你的位置我会写你自己的Dockerfile,并使用标准的软件包pipe理,如apt或yum。 快速检查Ubuntu的图像和python-pip和python-sqlalchemy是免费的。

有更多令人费解的解决scheme,可能适合你使用ShutIt,高兴地离线讨论,因为我觉得这有点偏离主题。 ShutIt是为这种用例编写的,因为我可以看到,由于Dockerfiles在微服务空间之外的有限实用性,这将是一个常见的问题。