Hoe voorkom je dat docker-compose dezelfde afbeelding meerdere keren bouwt?

Mijn docker-compose.ymlspecificeert 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 --buildom de afbeeldingen opnieuw op te bouwen. Het probleem is dat docker dezelfde myimagetwee 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_servicevoor 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_servicevoor 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

Other episodes