Docker: Beberapa Dockerfiles dalam proyek

216

Bagaimana Anda mengatur Dockerfiles milik proyek ketika Anda memiliki satu Dockerfile untuk database, satu untuk server aplikasi, dan sebagainya? Apakah Anda membuat semacam hierarki di sumbernya? Proyek perusahaan besar tidak hanya terdiri dari satu Dockerfile?

Luke yang beruntung
sumber
16
Anda mungkin ingin mengubah jawaban yang diterima
pomber
3
Seharusnya ada opsi untuk "mengungguli" dan memindahkan secara otomatis atribut `Diterima 'usang ke jawaban yang lebih tepat. Kriteria kelayakan untuk langkah seperti itu bisa 1) perbedaan besar dalam suara katakanlah, 10: 1 DAN 2) pertanyaan penulis belum login untuk mengatakan, satu tahun atau lebih (sepertinya @LuckyLuke telah pensiun dari SO 4 tahun) lalu ...)
mirekphd

Jawaban:

6

Catatan Penulis

Jawaban ini kedaluwarsa. Gambar tidak lagi ada dan telah digantikan oleh komposisi Docker . Jawaban yang diterima tidak dapat dihapus ....

Docker Compose mendukung pembangunan hierarki proyek. Jadi sekarang mudah untuk mendukung Dockerfile di setiap sub direktori.

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

Jawaban asli

Saya baru saja membuat direktori yang berisi Dockerfile untuk setiap komponen. Contoh:

Ketika membangun wadah hanya berikan nama direktori dan Docker akan memilih Dockerfile yang benar.

Mark O'Connor
sumber
3
@DuncanJones Karena Anda tidak dapat menghapus jawaban yang diterima ... Mencoba :-)
Mark O'Connor
286

Dalam versi yang lebih baru (> = 1.8.0) dari buruh pelabuhan , Anda dapat melakukan ini

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

Hemat besar.

EDIT: perbarui versi per komentar raksja

EDIT: komentar dari @vsevolod: dimungkinkan untuk mendapatkan penyorotan sintaks dalam kode VS dengan memberikan file .Dockerfile ekstensi (bukan nama) misalnya Prod.Dockerfile, Test.Dockerfile dll.

Shuo
sumber
2
versi mana yang lebih baru?
raksja
4
Baru saja diperiksa, github.com/docker/docker/wiki , jadi itu> Docker 1.8.0
raksja
3
yakin ini bekerja, tetapi IDE saya tidak akan melakukan penyorotan sintaks apa pun, karena itu tidak mengenali nama file :(
Alexander Mills
3
@AlexanderMills IDE WebStorm saya bahkan tidak mengizinkan Dockerfile.webkonfigurasi yang dijalankan. Jadi saya membuat masalah: youtrack.jetbrains.com/issue/WEB-28185
steampowered
5
Bagaimana Anda menentukan Dockerfile mana yang harus digunakan untuk setiap 'layanan' yang ditentukan dalam docker-compose.ymlfile, misalnya?
JoeTidee
128

Gunakan docker-composedan multipel Dockerfiledalam direktori yang terpisah

Jangan ganti namaDockerfile menjadi Dockerfile.dbatau Dockerfile.web, itu mungkin tidak didukung oleh IDE Anda dan Anda akan kehilangan penyorotan sintaksis.

Seperti yang dikatakan Kingsley Uchnor , Anda dapat memiliki banyakDockerfile , satu direktori, yang mewakili sesuatu yang ingin Anda bangun.

Saya suka memiliki dockerfolder yang menampung setiap aplikasi dan konfigurasinya. Berikut ini adalah contoh hierarki folder proyek untuk aplikasi web yang memiliki database.

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

docker-compose.yml contoh:

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 contoh penggunaan baris perintah:

# 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

Jika Anda memerlukan file dari folder sebelumnya ketika membangun Dockerfile Anda

Anda masih dapat menggunakan solusi di atas dan menempatkan Anda Dockerfiledi direktori seperti docker/web/Dockerfile, yang Anda butuhkan hanyalah mengatur build contextdi docker-compose.ymlseperti ini:

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

Dengan cara ini, Anda akan dapat memiliki hal-hal seperti ini:

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

dan ./docker/web/Dockerfileseperti ini:

FROM alpine:latest

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

Berikut adalah beberapa perintah cepat dari tldr docker-compose . Pastikan Anda merujuk ke dokumentasi resmi untuk detail lebih lanjut.

GabLeRoux
sumber
1
Bagaimana jika Anda perlu menyalin file manajer paket untuk menginstal deps pada waktu pembangunan (fi COPY ../package.json /app/package.json)? File itu biasanya berada di tingkat root dan buruh pelabuhan telah melarang akses ke induknya. Pendekatan apa yang akan Anda ikuti?
nass600
1
Aku telah memukul bahwa pembatasan juga dan untuk pengecualian ini, saya membangun webproyek dari . (dalam docker-compose.yml: build: .). Dengan cara ini, webmemiliki akses ke root file saat membangun. Saya telah melihat pertanyaan terkait ini: stackoverflow.com/questions/24537340/… dan kita dapat membangun dari direktori induk sebagai gantinya ketika menggunakan dockerbaris perintah dan jawaban ini menunjukkan bagaimana melakukannya dengan komposisi buruh pelabuhan: stackoverflow.com/a/45353241/ 1092815
GabLeRoux
1
Ini adalah masalah dengan IDE Anda, bukan dengan buruh pelabuhan. @ Shuo memiliki jawaban yang benar.
BentOnCoding
1
Jawaban kedua adalah 1 tahun tetapi tidak langsung diambil dari dokumentasi Docker. -fPilihannya baik-baik saja, tetapi saya lebih suka menggunakan docker-composedengan subfolder. Saya pikir kedua jawaban itu valid. Kebanyakan orang mungkin lebih suka membiarkan Dockerfilenama default untuk mendukung sebagian besar IDE di luar kotak. Saya tidak membatalkan jawaban pertama, saya hanya memberikan alternatif. Saya hanya tidak suka IDE saya untuk berpikir Dockerfile saya adalah phpfile ketika saya gunakan Dockerfile.php, tapi ya, itu berfungsi. Saya telah melihat beberapa contoh dalam dokumentasi buruh pelabuhan; Dockerfile.build,, Dockerfile.debugdll.
GabLeRoux
3
Penamaan sebagai example.Dockerfilemenjaga penyorotan sintaks dan ikon pada VSCode.
vmassuchetto
8

Di Intellij, saya sederhana mengubah nama file buruh pelabuhan menjadi * .Dockerfile, dan mengaitkan jenis file * .Dockerfile ke sintaks buruh pelabuhan.

KaziMurtaza
sumber
1
Sudah mencoba ini dan saya mendapatkan ikon Docker yang bagus.
Drumbeg
3

Tambahkan lapisan abstraksi, misalnya, file YAML seperti dalam proyek ini https://github.com/larytet/dockerfile-generator yang terlihat seperti

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

Skrip / make Python pendek dapat menghasilkan semua Dockerfiles dari file konfigurasi.

Larytet
sumber
1

Saat mengerjakan proyek yang membutuhkan penggunaan beberapa dockerfiles, cukup buat setiap dockerfile di direktori terpisah. Misalnya,

app / db /

Masing-masing direktori di atas akan berisi file docker mereka. Ketika aplikasi sedang dibangun, buruh pelabuhan akan mencari semua direktori dan membangun semua buruh pelabuhan.

Kingsley Uchnor
sumber