2015-04-23 21 views
8

Tôi đang sử dụng docker-compose và tôi muốn sử dụng các Dockerfiles khác nhau cho các bước xây dựng các dịch vụ khác nhau. Các docs dường như đề nghị để đặt Dockerfiles khác nhau trong các thư mục khác nhau, nhưng tôi muốn tất cả chúng được trong cùng một (và có lẽ phân biệt bằng cách sử dụng quy ước sau đây: Dockerfile.postgres, Dockerfile.main ...). Điều này có thể không?docker-compose: sử dụng nhiều Dockerfiles cho nhiều dịch vụ

Edit: Kịch bản tôi có chứa Docker-soạn tập tin này:

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

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

nơi postgresdb 's Dockerfile là:

FROM postgres 

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

và chính là:

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/ 

Điều này hoạt động ngay bây giờ, nhưng tôi muốn mở rộng kết thúc của Dockerfile postgresdb 's bằng cách gọi một kịch bản Python tạo bảng trong cơ sở dữ liệu theo mô hình được xây dựng dựa trên SQL Alchemy (kịch bản Python sẽ được gọi là python manage.py create_tables). Tôi muốn thêm nó vào Dockerfile của db, nhưng do sự cô lập của các container tôi không thể sử dụng SQL Alchemy ở đó vì hình ảnh đó dựa trên hình ảnh postgres thay vì Python, và nó không chứa gói sqlalchemy .. .

Tôi có thể làm gì? Tôi đã cố gắng sử dụng dịch vụ main trong postgresdb, nhưng tiếc là nó không mang theo python và các gói của nó, vì vậy tôi vẫn không thể viết một Dockerfile duy nhất để tạo cơ sở dữ liệu Postgres (thông qua shell script) cũng như các bảng của nó (thông qua một kịch bản Python).

Trả lời

11

Điều này là không thể do cách Docker xử lý các ngữ cảnh xây dựng.

Bạn sẽ phải sử dụng và đặt Dockerfile trong mỗi thư mục trở thành một phần của bối cảnh xây dựng Docker cho rằng dịch vụ.

Xem: Dockerfile

Bạn sẽ trong thực tế đòi hỏi phải có docker-compose.yml trông giống như:

service1: 
    build: service1 

service2: 
    build: service2 

Xem: docker-compose

Cập nhật:

Để giải quyết use- cụ thể của bạn trường hợp - Trong khi tôi hiểu những gì bạn đang cố gắng làm tại sao cá nhân tôi không tự mình làm điều này. Sự cô lập là một điều tốt đẹp và giúp quản lý kỳ vọng và sự phức tạp. Tôi sẽ thực hiện "tạo cơ sở dữ liệu" như một vùng chứa khác dựa trên mã nguồn của ứng dụng hoặc trong chính vùng chứa ứng dụng.

Hoặc bạn có thể xem xét các giải pháp theo kịch bản và mẫu khác như shutit (Tôi không có kinh nghiệm nhưng đã nghe thấy tiếng thần thiên về).

FWIW: Tách mối quan tâm ftw :)

+0

Hey James - cảm ơn bạn! Tôi đã chỉnh sửa câu hỏi và thêm lý do tôi muốn làm điều này; bạn có biết cách mở rộng dịch vụ để giải quyết vấn đề này không? Cảm ơn một lần nữa! – aralar

1

Trình tạo của ShutIt tại đây.Vui mừng khi biết rằng mọi người đang nghe những điều tốt đẹp về nó.

Thành thật mà nói, ở vị trí của bạn, tôi sẽ viết Dockerfile của riêng bạn và sử dụng quản lý gói chuẩn như apt hoặc yum. Một kiểm tra nhanh chóng với một hình ảnh ubuntu và python-pip và python-sqlalchemy có sẵn miễn phí.

Có nhiều giải pháp phức tạp hơn có thể hữu ích cho bạn khi sử dụng ShutIt, vui lòng thảo luận điều này khi ngoại tuyến, vì tôi nghĩ rằng đó là một chút chủ đề. ShutIt đã được viết cho loại trường hợp sử dụng này, vì tôi có thể thấy rằng đây sẽ là một vấn đề phổ biến do tiện ích giới hạn của Dockerfiles bên ngoài không gian microservices.

Các vấn đề liên quan