Docker: hoe de hostmap live te synchroniseren met de containermap?

Ik werk aan een website die mogelijk wordt gemaakt door Node. Dus ik heb een eenvoudig Docker-bestand gemaakt dat de bestanden van mijn site toevoegt aan de FS van de container, Node installeert en de app uitvoert wanneer ik de container uitvoer, waardoor de privépoort 80 zichtbaar wordt.

Maar als ik een bestand voor die app wil wijzigen, moet ik de containerimage opnieuw opbouwen en opnieuw uitvoeren. Dat duurt enkele seconden.

Is er een gemakkelijke manier om een ​​soort van “live sync”, NFS-achtig, te hebben om de app-bestanden van mijn hostsysteem synchroon te laten lopen met die van de draaiende container?

Op deze manier hoef ik het alleen opnieuw te starten om wijzigingen door te voeren, of nog beter, als ik iets als supervisorgebruik, wordt het automatisch gedaan.


Antwoord 1, autoriteit 100%

U kunt hiervoor volumes gebruiken. Je hebt twee opties:

  1. Door Docker beheerde volumes:

    docker run -v /src/path nodejsapp
    docker run -i -t -volumes-from <container id> bash
    

Het bestand dat u in de tweede container bewerkt, zal de eerste updaten.

  1. Hostmapvolume:

    docker run -v `pwd`/host/src/path:/container/src/path nodejsapp
    

De wijzigingen die u op de host aanbrengt, zullen de container bijwerken.


Antwoord 2, autoriteit 10%

Als je onder OSX werkt, kunnen dat soort volumeshares erg traag worden, vooral met op knooppunten gebaseerde apps (veel bestanden). Voor dit probleem kan http://docker-sync.iohelpen door een volume-share-achtige synchronisatie te bieden , zonder volumeshares te gebruiken, versnelt dit gewoonlijk de lees-/schrijfsnelheid van uw container van de codemap van 50-80 keer, afhankelijk van welke docker-machine u gebruikt.

Voor prestaties zie https://github.com/EugenMayer/docker -sync/wiki/4.-Performanceen voor eenvoudige voorbeelden hoe het te gebruiken, zie de standaardteksten https://github.com/EugenMayer/docker-sync-boilerplatevoor jouw geval het unisono-voorbeeld https://github.com/EugenMayer/docker-sync-boilerplate/tree/master/unisonis degene die je nodig hebt voor NFS-achtige synchronisatie


Antwoord 3, autoriteit 4%

docker run -dit -v ~/my/local/path:/container/path/ myimageId

Voor /container/path/zou je bijvoorbeeld /usr/src/appkunnen gebruiken.
De vlaggen:

-d = vrijstaande modus,

-it = interactief,

-v + paden = specificeert het volume.

(Als u alleen om het volume geeft, kunt u de vlag -dit laten vallen.)

Docker-runreferentie


Antwoord 4

Ik gebruik hiervoor de Bestandssynchronisatie-functionaliteit van Scaffold. Het klaart de klus, en zonder al te complexe configuratie.

Scaffold opzetten in mijn project was net zo eenvoudig als Skaffold installeren(via chocolatey, aangezien ik ‘m op Windows), skaffold init --generate-manifestsin mijn projectmap uitvoeren en een paar vragen beantwoorden.

Other episodes