我使用的是docker-compose,我想使用不同的Dockerfiles来提供不同的服务'构建步骤。 docs似乎建议将不同的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脚本将被称为python manage.py create_tables
)。我想将它添加到db的Dockerfile中,但是由于容器的隔离,我不能在那里使用SQL Alchemy,因为该图像基于postgres
图像而不是Python&#39 ; s,它不包含sqlalchemy
包...
我该怎么办?我尝试在main
中使用postgresdb
服务,但不幸的是它没有携带python及其包,所以我仍然无法编写创建Postgres数据库的单个Dockerfile (通过shell脚本)及其表(通过Python脚本)。
答案 0 :(得分:12)
由于Docker处理构建上下文的方式,这是不可能的。
您必须在每个目录中使用并放置Dockerfile
,该目录将成为 服务的Docker构建上下文的一部分。
请参阅:Dockerfile
您实际上需要docker-compose.yml
看起来像:
service1:
build: service1
service2:
build: service2
请参阅:docker-compose
<强>更新强>
解决您的特定用例 - 虽然我了解您正在尝试做什么以及为什么我个人不会自己做这件事。隔离是好事,有助于管理期望和复杂性。我会执行&#34;数据库创建&#34;作为另一个基于应用程序源代码的容器或在应用程序容器本身内的容器。
或者你可以查看更多脚本和模板驱动的解决方案,例如shutit(我没有经验,但听过关于的上帝的想法)。
FWIW:关注点分离:)
答案 1 :(得分:5)
您必须在构建部分添加它。 因此,您可以为每个服务指定不同的替代dockerfiles。
services:
service1:
build:
context: .
args:
- NODE_ENV=local
dockerfile: Dockerfile_X
ports:
- "8765:8765"
答案 2 :(得分:2)
ShutIt的创造者。很高兴听到人们听到了很好的事情。
说实话,在你的位置我会编写你自己的Dockerfile并使用标准的包管理,比如apt或yum。可以免费使用ubuntu图像和python-pip以及python-sqlalchemy进行快速检查。
使用ShutIt可能会为您提供更复杂的解决方案,很高兴离线讨论,因为我觉得它有点偏离主题。 ShutIt是为这种用例编写的,因为我可以看到,这将是一个常见的问题,因为Dockerfiles&#39;微服务空间外的有限效用。
答案 3 :(得分:2)
您可以在dockerfile
中使用docker-compose.yml
参数为特定服务指定备用参数。
我不知道它何时被添加,因为讨论已经过时了,但您可以在参考https://docs.docker.com/compose/compose-file/#dockerfile
中看到它昨天我试过了,它和我一起工作。
它是我的项目的基础目录Dockerfile
和Dockerfile-service3
以及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
之外的所有服务都将使用标准Dockerfile
构建,而service3
将使用Dockerfile-service3
构建。