Hoe organiseer je de Dockerfiles die bij een project horen als je één Dockerfile hebt voor de database, één voor de applicatieserver, enzovoort? Creëer je een soort hiërarchie in de bron?
Een groot bedrijfsproject kan niet uit slechts één Dockerfile bestaan?
Antwoord 1, autoriteit 100%
In nieuwere versies(>=1.8.0) van dockerkunt u dit doen
docker build -f Dockerfile.db .
docker build -f Dockerfile.web .
Een grote besparing.
EDIT: update versies per opmerking van raksja
EDIT: commentaar van @vsevolod: het is mogelijk om syntaxisaccentuering in VS-code te krijgen door bestanden .Dockerfile-extensie (in plaats van naam) te geven, b.v. Prod.Dockerfile, Test.Dockerfile enz.
Antwoord 2, autoriteit 50%
Gebruik docker-compose
en meerdere Dockerfile
in aparte mappen
Hernoem uw
Dockerfile
niet naarDockerfile.db
ofDockerfile.web
, dit is misschien niet zo ondersteund door uw IDE en u verliest syntaxisaccentuering.
Zoals Kingsley Uchnor zei, kun je meerdere Dockerfile
hebben, één per map, die vertegenwoordigen iets dat u wilt bouwen.
Ik wil graag een docker
-map hebben die alle applicaties en hun configuratie bevat. Hier is een voorbeeld van een projectmaphiërarchie voor een webtoepassing die een database heeft.
docker-compose.yml
docker
├── web
│ └── Dockerfile
└── db
└── Dockerfile
docker-compose.yml
voorbeeld:
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
voorbeeld van opdrachtregelgebruik:
# 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
In het geval dat u bestanden uit vorige mappen nodig heeft bij het bouwen van uw Dockerfile
U kunt nog steeds de bovenstaande oplossing gebruiken en uw Dockerfile
in een map zoals docker/web/Dockerfile
plaatsen, u hoeft alleen de build context
in uw docker-compose.yml
als volgt:
version: '3'
services:
web:
build:
context: .
dockerfile: ./docker/web/Dockerfile
ports:
- "5000:5000"
volumes:
- .:/code
Op deze manier kun je dit soort dingen krijgen:
config-on-root.ini
docker-compose.yml
docker
└── web
├── Dockerfile
└── some-other-config.ini
en een ./docker/web/Dockerfile
zoals deze:
FROM alpine:latest
COPY config-on-root.ini /
COPY docker/web/some-other-config.ini /
Hier zijn enkele snelle opdrachten van tldr docker -componeren. Zorg ervoor dat u de officiële documentatieraadpleegt voor meer details.
Antwoord 3, autoriteit 7%
Opmerking van de auteur
Dit antwoord is verouderd.Fig bestaat niet meer en is vervangen door Docker componeren.
Geaccepteerde antwoorden kunnen niet worden verwijderd.
Docker Compose ondersteunt het bouwen van projecthiërarchie. Het is nu dus gemakkelijk om een Dockerfile in elke subdirectory te ondersteunen.
├── docker-compose.yml
├── project1
│ └── Dockerfile
└── project2
└── Dockerfile
Oorspronkelijk antwoord
Ik maak gewoon een map met een Dockerfile voor elke component. Voorbeeld:
Geef bij het bouwen van de containers gewoon de mapnaam op en Docker zal het juiste Dockerbestand selecteren.
Antwoord 4, autoriteit 3%
In Intellij heb ik eenvoudig de naam van de docker-bestanden gewijzigd in *.Dockerfile en het bestandstype *.Dockerfile gekoppeld aan de docker-syntaxis.
Antwoord 5
Voeg een abstractielaag toe, bijvoorbeeld een YAML-bestand zoals in dit project https://github. com/larytet/dockerfile-generatordie eruitziet als
centos7:
base: centos:centos7
packager: rpm
install:
- $build_essential_centos
- rpm-build
run:
- $get_release
env:
- $environment_vars
Een kort Python-script/make kan alle Dockerfiles uit het configuratiebestand genereren.
Antwoord 6
Als u aan een project werkt waarvoor meerdere dockerfiles nodig zijn, maakt u eenvoudig elk dockerbestand in een aparte map. Bijvoorbeeld,
app/
db/
Elk van de bovenstaande mappen zal hun dockerbestand bevatten. Wanneer een applicatie wordt gebouwd, doorzoekt docker alle mappen en bouwt alle dockerbestanden.