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?
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?
Câu trả lời:
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
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.
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.
Dockerfile.web
dướ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
docker-compose.yml
tệp, chẳng hạn?
docker-compose
và nhiều Dockerfile
trong các thư mục riêng biệtĐừng đổi tên của bạn
Dockerfile
thànhDockerfile.db
hoặcDockerfile.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 docker
thư 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
Bạn vẫn có thể sử dụng giải pháp trên và đặt bạn Dockerfile
và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 context
theo cách docker-compose.yml
như 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
và ./docker/web/Dockerfile
như 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.
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?
web
dự án từ .
(trong docker-compose.yml
: build: .
). Bằng cách này, web
có 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 docker
dò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
-f
tùy chọn là tốt, nhưng tôi thích sử dụng docker-compose
vớ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ữ Dockerfile
tê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 php
tệ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.debug
v.v.
example.Dockerfile
giữ tô sáng cú pháp và các biểu tượng trên VSCode.
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.
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.
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.