Docker: meerdere Docker-bestanden in project

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-composeen meerdere Dockerfilein aparte mappen

Hernoem uw Dockerfileniet naar Dockerfile.dbof Dockerfile.web, dit is misschien niet zo ondersteund door uw IDE en u verliest syntaxisaccentuering.

Zoals Kingsley Uchnor zei, kun je meerdere Dockerfilehebben, éé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.ymlvoorbeeld:

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-composevoorbeeld 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 Dockerfilein een map zoals docker/web/Dockerfileplaatsen, u hoeft alleen de build contextin uw docker-compose.ymlals 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/Dockerfilezoals 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.

Other episodes