Docker: Wiele plików Docker w projekcie

215

Jak organizujesz pliki Docker należące do projektu, gdy masz jeden plik Docker dla bazy danych, jeden dla serwera aplikacji i tak dalej? Czy tworzysz jakąś hierarchię w źródle? Projekt dużego przedsiębiorstwa nie może składać się tylko z jednego Dockerfile?

Lucky Luke
źródło
15
możesz zmienić przyjętą odpowiedź
pomber
3
Powinna istnieć opcja „przegłosowania” i automatycznego przeniesienia przestarzałego atrybutu „Zaakceptowano” do bardziej odpowiedniej odpowiedzi. Kryterium kwalifikowalności dla takiego posunięcia może być 1) duża różnica w głosach, powiedzmy 10: 1 ORAZ 2) autor pytania nie zalogował się powiedzmy, rok, ani dłużej (wydaje się, że @LuckyLuke wycofał się z SO 4 lata temu ...)
mirekphd

Odpowiedzi:

6

Uwaga autora

Ta odpowiedź jest nieaktualna. Fig już nie istnieje i został zastąpiony kompozycją Docker . Zaakceptowanych odpowiedzi nie można usunąć ....

Docker Compose obsługuje budowanie hierarchii projektu. Teraz można łatwo obsługiwać plik Dockerfile w każdym podkatalogu.

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

Oryginalna odpowiedź

Po prostu tworzę katalog zawierający plik Docker dla każdego komponentu. Przykład:

Podczas budowania kontenerów podaj tylko nazwę katalogu, a Docker wybierze prawidłowy plik Docker.

Mark O'Connor
źródło
3
@DuncanJones Ponieważ nie można usunąć zaakceptowanej odpowiedzi ... Próbowałem :-)
Mark O'Connor
286

W nowszych wersjach (> = 1.8.0) dokera możesz to zrobić

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

Duża oszczędność.

EDYCJA: zaktualizuj wersje według komentarza raksji

EDYCJA: komentarz od @vsevolod: można uzyskać wyróżnianie składni w kodzie VS, podając pliki. Rozszerzenie pliku dokującego (zamiast nazwy) np. Plik Prod.Docker, Test.Docker itp.

Shuo
źródło
2
która nowsza wersja
raksja 12.04.17
4
Właśnie sprawdzone, github.com/docker/docker/wiki , więc jego> Docker 1.8.0
raksja 14.04.17
3
pewnie to działa, ale moje IDE nie wykona jednak żadnego podświetlania składni, ponieważ nie rozpoznaje nazwy pliku :(
Alexander Mills
3
@AlexanderMills mój IDE WebStorm nawet nie pozwala Dockerfile.webna konfigurację uruchamiania. Więc stworzyłem problem: youtrack.jetbrains.com/issue/WEB-28185
steampowered
5
W jaki sposób określasz, który plik Docker powinien być używany na przykład dla każdej „usługi” zdefiniowanej w docker-compose.ymlpliku?
JoeTidee
127

Użyj docker-composei wielu Dockerfilew osobnych katalogach

Nie zmieniaj nazwyDockerfile na Dockerfile.dblub Dockerfile.web, może to nie być obsługiwane przez twoje IDE i stracisz podświetlanie składni.

Jak powiedział Kingsley Uchnor , możesz mieć wiele Dockerfile, jeden na katalog, które reprezentują coś, co chcesz zbudować.

Lubię mieć dockerfolder, w którym przechowywane są wszystkie aplikacje i ich konfiguracja. Oto przykładowa hierarchia folderów projektu dla aplikacji internetowej, która ma bazę danych.

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

docker-compose.yml przykład:

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 przykład użycia wiersza poleceń:

# 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

Jeśli potrzebujesz plików z poprzednich folderów podczas tworzenia pliku Docker

Nadal możesz użyć powyższego rozwiązania i umieścić go Dockerfilew katalogu, takim jak docker/web/Dockerfilewszystko, czego potrzebujesz, to ustawić kompilację contextw docker-compose.ymlnastępujący sposób:

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

W ten sposób będziesz mieć takie rzeczy:

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

i ./docker/web/Dockerfilepodobne:

FROM alpine:latest

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

Oto kilka szybkich poleceń z tldr docker-compose . Aby uzyskać więcej informacji , zapoznaj się z oficjalną dokumentacją .

GabLeRoux
źródło
1
Co zrobić, jeśli trzeba skopiować plik menedżera pakietów w celu instalacji, w zależności od czasu kompilacji (fi COPY ../package.json /app/package.json)? Plik ten zwykle znajduje się na poziomie głównym, a okno dokowane zabroniło dostępu do elementu nadrzędnego. Jakie podejście zastosujesz?
nass600
1
Mam hit to ograniczenie zbyt iw tym wyjątkiem, że zbudować webprojekt od . (w docker-compose.yml: build: .). W ten sposób webma dostęp do plików root podczas budowania. Widziałem to pokrewne pytanie: stackoverflow.com/questions/24537340/... i zamiast tego możemy budować z katalogu nadrzędnego, używając dockerwiersza polecenia, a ta odpowiedź pokazuje, jak to zrobić za pomocą docker-compose: stackoverflow.com/a/45353241/ 1092815
GabLeRoux
1
Jest to problem z twoim IDE, a nie z dokerem. @Shuo ma poprawną odpowiedź.
BentOnCoding
1
Druga odpowiedź ma 1 rok, ale nie pochodzi bezpośrednio z dokumentacji Dockera. -fopcja jest w porządku, ale wolę używać docker-composez podfolderami. Myślę, że obie odpowiedzi są prawidłowe. Większość ludzi może po prostu chcieć zachować domyślną Dockerfilenazwę, aby obsługiwać większość IDE od razu po wyjęciu z pudełka. Nie unieważniam pierwszej odpowiedzi, tylko zapewniam alternatywę. Po prostu nie lubię mojego IDE, aby myśleć, że mój phpplik Docker jest plikiem, gdy go używam Dockerfile.php, ale tak, to działa. Widziałem kilka przykładów w dokumentacji dokera; Dockerfile.build, Dockerfile.debugitp.
GabLeRoux
3
Naming as example.Dockerfilezachowuje podświetlanie składni i ikony w VSCode.
vmassuchetto
8

W programie Intellij po prostu zmieniłem nazwę plików dokera na * .Dockerfile i skojarzyłem typ pliku * .Dockerfile ze składnią dokera.

KaziMurtaza
źródło
1
Próbowałem tego i dostaję ładną ikonę Docker.
Drumbeg
3

Dodaj warstwę abstrakcji, na przykład plik YAML jak w tym projekcie https://github.com/larytet/dockerfile-generator, który wygląda jak

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

Krótki skrypt / marka Pythona może wygenerować wszystkie pliki Docker z pliku konfiguracyjnego.

Larytet
źródło
1

Podczas pracy nad projektem wymagającym użycia wielu plików dokerów po prostu utwórz każdy plik dokerów w osobnym katalogu. Na przykład,

app / db /

Każdy z powyższych katalogów będzie zawierał swój plik dokera. Podczas budowania aplikacji doker przeszuka wszystkie katalogi i skompiluje wszystkie pliki dokerów.

Kingsley Uchnor
źródło