Mijn docker-compose.yml
specificeert meerdere afbeeldingen. Twee van deze afbeeldingen zijn gemaakt met hetzelfde lokale Dockerfile
. Ze delen dezelfde afbeeldingsnaam, maar hebben elk een ander commando.
Tijdens de ontwikkeling gebruik ik vaak docker-compose up --build
om de afbeeldingen opnieuw op te bouwen. Het probleem is dat docker dezelfde myimage
twee keer bouwt, wat langer duurt dan nodig is.
Is er een manier om aan te geven dat de afbeelding maar één keer hoeft te worden gemaakt?
version: '2'
services:
abc:
image: myimage
command: abc
build:
context: .
dockerfile: Dockerfile
xyz:
image: myimage
command: xyz
build:
context: .
dockerfile: Dockerfile
Antwoord 1, autoriteit 100%
Per de documentatie van het docker-compose-bestandvoor build, specificeer build:
en image:
voor de eerste service, en dan alleen image:
voor volgende services.
Hier is een aangepaste versie van uw voorbeeld die de afbeelding slechts één keer opbouwt (voor abc-service) en die afbeelding opnieuw gebruikt voor xyz-service.
version: '2'
services:
abc:
image: myimage
command: abc
build:
context: .
dockerfile: Dockerfile
xyz:
image: myimage
command: xyz
Antwoord 2, autoriteit 10%
Je kunt een build-only-service nep maken om de afbeelding te bouwen en vervolgens afhankelijkheden daarvan gebruiken voor de daadwerkelijke werkers. Dat heeft als voordeel dat je niet één van die diensten automatisch laat starten als je de andere wil starten.
je moet een afbeeldingsnaam toevoegen om build:
en image:
op te geven voor de build-service, en ervoor zorgen dat deze wordt beëindigd en nooit automatisch opnieuw wordt opgestart.
Dan image:
en depends_on: first_service
voor uw diensten.
vind ik leuk:
version: '2'
services:
_myimage_build:
image: myimage
command: ['echo', 'build completed'] # any linux command which directly terminates.
build:
context: .
dockerfile: Dockerfile
first_service:
image: myimage
depends_on:
- _myimage_build
command: abc
second_service:
image: myimage
depends_on:
- _myimage_build
command: xyz
met dank aan @amath voor hun antwoord.
Antwoord 3, autoriteit 7%
Om het goede antwoord van @amath wat duidelijker te maken
je moet een afbeeldingsnaam toevoegen om build:
en image:
op te geven voor de eerste service, en dan image:
en depends_on: first_service
voor volgende services.
vind ik leuk:
version: '2'
services:
first_service:
image: myimage
command: abc
build:
context: .
dockerfile: Dockerfile
second_service:
image: myimage
command: xyz
depends_on:
- first_service
met dank aan @DrSensor voor de reactie