Hoe kan ik verschillende .dockerignore-bestanden specificeren voor verschillende builds in hetzelfde project?

Vroeger plaatste ik de directory testsin .dockerignorezodat deze niet zou worden opgenomen in de afbeelding, die ik gebruikte om een ​​webservice uit te voeren.

p>

Nu probeer ik Docker te gebruiken om mijn unit-tests uit te voeren, en in dit geval wil ik dat de directory testswordt opgenomen.

Ik heb docker build -hgecontroleerd en geen verwante optie gevonden.

Hoe kan ik dit doen?


Antwoord 1, autoriteit 100%

Docker 19.03 heeft hiervoor een oplossing geleverd.

De Docker-client probeert eerst <dockerfile-name>.dockerignorete laden en valt dan terug naar .dockerignoreals het niet kan worden gevonden. Dus docker build -f Dockerfile.foo .probeert eerst Dockerfile.foo.dockerignorete laden.

Het instellen van de DOCKER_BUILDKIT=1omgevingsvariabele is momenteel vereist om deze functie te gebruiken. Deze vlag kan worden gebruikt met docker composesinds 1.25.0 -rc3door onder vermelding van COMPOSE_DOCKER_CLI_BUILD=1.

Zie ook:


Antwoord 2, autoriteit 13%

Op dit moment is er geen manier om dit te doen. Er is een lange discussie gaande over het toevoegen van een --ignorevlag aan Docker om het negeerbestand te leveren dat moet worden gebruikt – zie hier.

De opties die je op dit moment hebt zijn meestal lelijk:

  • Verdeel uw project in submappen die elk hun eigen Dockerfileen .dockerignorehebben, wat in uw geval mogelijk niet werkt.
  • Maak een script dat de relevante bestanden naar een tijdelijke map kopieert en voer daar de Docker-build uit.

Antwoord 3, autoriteit 2%

Het zou hier een optie kunnen zijn om de opgeschoonde tests als volumemount aan de container toe te voegen. Nadat u de afbeelding hebt gemaakt, koppelt u de broncode met de tests bovenop de opgeschoonde code als u deze uitvoert om te testen.

services:
   tests:
      image: my-clean-image
      volumes:
         - '../app:/opt/app' # Add removed tests

Antwoord 4

Ik heb geprobeerd de DOCKER_BUILDKITte activeren zoals voorgesteld door @thisismydesign, maar ik kwam andere problemen tegen (buiten het bestek van deze vraag).

Als alternatief maak ik een tussenliggende tar door de vlag -T te gebruiken die een txt-bestand nodig heeft met de bestanden die in mijn tar moeten worden opgenomen, dus het is niet zo anders dan een witte lijst .dockerignore.

Ik exporteer deze tar en pijp het naar de docker build-opdracht, en specificeer mijn docker-bestand, dat overal in mijn bestandshiërarchie kan staan. Uiteindelijk ziet het er zo uit:

tar -czh -T files-to-include.txt | docker build -f path/to/Dockerfile -

Other episodes