Docker: Nhiều Dockerfiles trong dự án


214

Làm thế nào để bạn tổ chức Dockerfiles thuộc một dự án khi bạn có một Dockerfile cho cơ sở dữ liệu, một cho máy chủ ứng dụng, v.v. Bạn có tạo ra một số loại hierachy trong nguồn không? Một dự án doanh nghiệp lớn không thể chỉ bao gồm một Dockerfile?


15
bạn có thể muốn thay đổi câu trả lời được chấp nhận
pomber

3
Cần có một tùy chọn để "outvote" và tự động chuyển một thuộc tính 'Được chấp nhận' lỗi thời sang một câu trả lời phù hợp hơn. Tiêu chí đủ điều kiện cho một động thái như vậy có thể là 1) sự khác biệt lớn về số phiếu nói, 10: 1 VÀ 2) tác giả câu hỏi đã không đăng nhập để nói, một năm hoặc lâu hơn (có vẻ như @LuckyLuke đã nghỉ hưu từ SO 4 năm trước đây ...)
mirekphd

Câu trả lời:


6

Lưu ý của tác giả

Câu trả lời này đã hết hạn. Hình không còn tồn tại và đã được thay thế bởi Docker compose . Câu trả lời được chấp nhận không thể bị xóa ....

Docker Compose hỗ trợ xây dựng hierachy dự án. Vì vậy, giờ đây thật dễ dàng để hỗ trợ Dockerfile trong mỗi thư mục con.

├── docker-compose.yml
├── project1
│   └── Dockerfile
└── project2
    └── Dockerfile

Câu trả lời gốc

Tôi chỉ tạo một thư mục chứa Dockerfile cho mỗi thành phần. Thí dụ:

Khi xây dựng các container chỉ cần cung cấp tên thư mục và Docker sẽ chọn Dockerfile chính xác.


3
@DuncanJones Vì bạn không thể xóa câu trả lời được chấp nhận ... Đã thử :-)
Đánh dấu O'Connor

285

Trong các phiên bản mới hơn (> = 1.8.0) của docker , bạn có thể làm điều này

docker build -f Dockerfile.db .
docker build -f Dockerfile.web .

Một tiết kiệm lớn.

EDIT: cập nhật phiên bản cho mỗi bình luận của raksja

EDIT: nhận xét từ @vsevolod: có thể lấy tô sáng cú pháp trong mã VS bằng cách cho các tệp .Dockerfile mở rộng (thay vì tên), vd: Prod.Dockerfile, Test.Dockerfile, v.v.


2
phiên bản mới hơn?
raksja

4
Chỉ cần kiểm tra, github.com/docker/docker/wiki , vì vậy> Docker 1.8.0
raksja

3
chắc chắn điều này hoạt động, nhưng IDE của tôi sẽ không thực hiện bất kỳ cú pháp tô sáng nào, bởi vì nó không nhận ra tên tệp :(
Alexander Mills

3
@AlexanderMills IDE WebStorm của tôi thậm chí không cho phép Dockerfile.webdưới dạng cấu hình chạy. Vì vậy, tôi đã tạo ra một vấn đề: youtrack.jetbrains.com/issue/WEB-28185
steampowered

5
Làm thế nào để bạn chỉ định Dockerfile nào sẽ được sử dụng cho mỗi 'dịch vụ' được xác định trong một docker-compose.ymltệp, chẳng hạn?
JoeTidee

127

Sử dụng docker-composevà nhiều Dockerfiletrong các thư mục riêng biệt

Đừng đổi tên của bạnDockerfile thành Dockerfile.dbhoặc Dockerfile.web, nó có thể không được IDE của bạn hỗ trợ và bạn sẽ mất đánh dấu cú pháp.

Như Kingsley Uchnor đã nói , bạn có thể có nhiều Dockerfile, một cho mỗi thư mục, đại diện cho một cái gì đó bạn muốn xây dựng.

Tôi muốn có một dockerthư mục chứa từng ứng dụng và cấu hình của chúng. Dưới đây là một hệ thống phân cấp thư mục dự án ví dụ cho một ứng dụng web có cơ sở dữ liệu.

docker-compose.yml
docker
├── web
│   └── Dockerfile
└── db
    └── Dockerfile

docker-compose.yml thí dụ:

version: '3'
services:
  web:
    # will build ./docker/web/Dockerfile
    build: ./docker/web
    ports:
     - "5000:5000"
    volumes:
     - .:/code
  db:
    # will build ./docker/db/Dockerfile
    build: ./docker/db
    ports:
      - "3306:3306"
  redis:
    # will use docker hub's redis prebuilt image from here:
    # https://hub.docker.com/_/redis/
    image: "redis:alpine"

docker-compose ví dụ sử dụng dòng lệnh:

# The following command will create and start all containers in the background
# using docker-compose.yml from current directory
docker-compose up -d

# get help
docker-compose --help

Trong trường hợp bạn cần các tệp từ các thư mục trước đó khi xây dựng Dockerfile của bạn

Bạn vẫn có thể sử dụng giải pháp trên và đặt bạn Dockerfilevào một thư mục như docker/web/Dockerfile, tất cả những gì bạn cần là đặt bản dựng contexttheo cách docker-compose.ymlnhư sau:

version: '3'
services:
  web:
    build:
      context: .
      dockerfile: ./docker/web/Dockerfile
    ports:
     - "5000:5000"
    volumes:
     - .:/code

Bằng cách này, bạn sẽ có thể có những thứ như thế này:

config-on-root.ini
docker-compose.yml
docker
└── web
    ├── Dockerfile
    └── some-other-config.ini

./docker/web/Dockerfilenhư thế này:

FROM alpine:latest

COPY config-on-root.ini /
COPY docker/web/some-other-config.ini /

Dưới đây là một số lệnh nhanh từ tldr docker-compose . Hãy chắc chắn rằng bạn tham khảo tài liệu chính thức để biết thêm chi tiết.


1
Điều gì sẽ xảy ra nếu bạn cần sao chép tệp quản lý gói để cài đặt deps vào thời gian xây dựng (fi COPY ../package.json /app/package.json)? Tập tin đó thường sẽ ở cấp gốc và docker đã cấm truy cập vào cha mẹ. Cách tiếp cận nào bạn sẽ làm theo?
nass600

1
Tôi đã trúng đó hạn chế quá và cho ngoại lệ này, tôi xây dựng các webdự án từ . (trong docker-compose.yml: build: .). Bằng cách này, webcó quyền truy cập vào các tập tin gốc khi xây dựng. Tôi đã thấy câu hỏi liên quan này: stackoverflow.com/questions/24537340/ và chúng ta có thể xây dựng từ thư mục mẹ thay vì khi sử dụng dockerdòng lệnh và câu trả lời này cho thấy cách thực hiện với docker-compose: stackoverflow.com/a/45353241/ 1092815
GabLeRoux

1
Đây là một vấn đề với IDE của bạn, không phải với docker. @Shuo có câu trả lời đúng.
BentOnCoding

1
Câu trả lời thứ hai là 1 năm nhưng nó không được lấy trực tiếp từ tài liệu của Docker. -ftùy chọn là tốt, nhưng tôi thích sử dụng docker-composevới các thư mục con. Tôi nghĩ rằng cả hai câu trả lời là hợp lệ. Hầu hết mọi người có thể chỉ muốn giữ Dockerfiletên mặc định để hỗ trợ hầu hết các IDE ngoài hộp. Tôi không làm mất hiệu lực câu trả lời đầu tiên, tôi chỉ cung cấp một giải pháp thay thế. Tôi chỉ không thích IDE của mình nghĩ rằng Dockerfile của tôi là một phptệp khi tôi sử dụng Dockerfile.php, nhưng vâng, nó hoạt động. Tôi đã thấy một vài ví dụ trong tài liệu về docker; Dockerfile.build, Dockerfile.debugv.v.
GabLeRoux

3
Đặt tên là example.Dockerfilegiữ tô sáng cú pháp và các biểu tượng trên VSCode.
vmassuchetto

8

Trong Intellij, tôi đơn giản thay đổi tên của các tệp docker thành * .Dockerfile và liên kết loại tệp * .Dockerfile thành cú pháp docker.


1
Đã thử điều này và tôi nhận được một biểu tượng Docker đẹp.
Drumbeg

3

Thêm một lớp trừu tượng, ví dụ: tệp YAML như trong dự án này https://github.com/larytet/dockerfile-generator trông giống như

centos7:
    base: centos:centos7
    packager: rpm
    install:
      - $build_essential_centos 
      - rpm-build
    run:
      - $get_release
    env:
      - $environment_vars

Một tập lệnh / make Python ngắn có thể tạo tất cả Dockerfiles từ tệp cấu hình.


1

Khi làm việc trên một dự án yêu cầu sử dụng nhiều dockerfile, chỉ cần tạo mỗi dockerfile trong một thư mục riêng. Ví dụ,

ứng dụng / db /

Mỗi thư mục trên sẽ chứa dockerfile của chúng. Khi một ứng dụng đang được xây dựng, docker sẽ tìm kiếm tất cả các thư mục và xây dựng tất cả các dockerfiles.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.