Docker Cp gebruiken om bestanden tussen host en containers te kopiëren

0
178

Wilt u enkele bestanden in of uit een Docker-container halen? Met de opdracht docker cp kunt u kopiëren tussen host- en containerbestandssystemen, zodat u configuratiedetails kunt toevoegen, back-ups kunt maken en bestaande gegevens kunt herstellen.

Basissyntaxis

docker cp accepteert bron- en bestemmingspaden als zijn twee argumenten:

docker cp example.txt my-container:/example.txt

Hier wordt example.txt gekopieerd van uw werkdirectory naar /example.txt in de mijn container container. U kunt de twee argumenten omdraaien om /example.txt uit de container en in uw werkdirectory te kopiëren.

Het argument dat verwijst naar het containerpad moet worden voorafgegaan door een container-ID of -naam gevolgd door een dubbele punt (:). U kunt de ID of naam van een actieve container vinden met docker ps.

Advertentie

Elk docker-cp-commando heeft één lokaal bestandssysteempad en één containerpad nodig – u kunt niet rechtstreeks kopiëren tussen twee containers. Gebruik indien nodig een procedure in meerdere stappen, waarbij u eerst kopieert van de broncontainer naar uw bestandssysteem en vervolgens van het nieuwe lokale pad naar de doelcontainer.

Hele mappen kopiëren

docker cp kan ook recursief mappen kopiëren:

docker cp /home/demo/website apache-container:/var/www /html/.

Docker kopieert alles in /home/demo/website en zet het over naar /var/www/html.

Kopieergedrag

Wanneer u een bestand kopieert, maakt Docker een nieuw bestand aan op de bestemming als het nog niet bestaat. Bestaande bestanden worden overschreven met de nieuwe inhoud. Wanneer de bestemming een map is, wordt het bestand ernaar gekopieerd met de bronbestandsnaam. Een uitzondering is wanneer de opgegeven bestemming eindigt met een /, die een map aangeeft, maar het pad nog niet bestaat. In dit scenario wordt een fout gegenereerd.

Het proces is iets gecompliceerder voor directory-kopieën. Er wordt een nieuwe map gemaakt op de bestemming met de inhoud van de bronmap, als het doelpad nog niet bestaat. Als het bestaat, verschilt het gedrag afhankelijk van of je een afsluitende /. component in het pad.

  • /. is aanwezig – De bronmap wordt gekopieerd naar de bestaande doelmap.
  • /. is niet aanwezig – De inhoud van de bronmap wordt naar de bestemming gekopieerd.

Het subtiele onderscheid bepaalt of er een nieuwe submap binnen de bestemming wordt gemaakt.

Opdrachtbeperkingen

Ondanks zijn naam is docker cp geen volledige implementatie van het cp shell-commando. De cp-vlaggen worden niet ondersteund, behalve voor -a en -L:

  • -a – Archiefmodus, die gebruikers- en groepsgegevens op gekopieerde bestanden bewaart.
  • -L – Volg symbolische links in de bronmap om de inhoud van linkdoelen te kopiëren, in plaats van de links zelf.

Voor meer geavanceerde toepassingen waarbij selectief kopiëren vereist is, moet u terugvallen op een andere benadering.

Bind-koppelingen gebruiken om bestanden te kopiëren

Docker-volumes bieden een andere manier om bestanden tussen containers en uw host te verplaatsen. Bind, door een lokale map in een container te koppelen, krijgt u toegang tot de inhoud van uw hostbestandssysteem, zodat u geen docker cp hoeft te gebruiken.

docker run -v /example/host/directory:/container/path my-image:latest Advertentie

De inhoud van het /example/host/directory-pad wordt in het bestandssysteem van de container gemount op /container/path. U kunt met deze bestanden omgaan buiten Docker met behulp van bekende tools zoals cp, rsync en uw grafische bestandsbrowser.

Deze techniek is alleen nuttig als u met een enkele containerdirectory werkt. Het werkt niet goed als je kopieert vanaf willekeurige locaties, omdat je van tevoren moet weten welke paden je gaat gebruiken, wanneer de container wordt gemaakt.

Je moet ook op je hoede zijn voor bestandssysteemmachtigingen: bestanden die in de container zijn gemaakt, zijn meestal eigendom van root. Dit kan ongemakkelijke scenario's creëren op de host waar u geen bestanden kunt bewerken of verwijderen in de gebonden map. Gebruik de opdracht chown op de host en in de container om indien nodig het eigendom te wijzigen, afhankelijk van de omgeving.

Hoe zit het met COPY in Dockerfiles?

docker cp kan soms worden verward met de COPY-instructie in Dockerfiles. Het is belangrijk om te erkennen dat deze twee functies zeer verschillende gebruiksscenario's dienen.

COPY kan niet worden gebruikt om bestanden tussen uw host en een actieve container te verplaatsen. Het is om bestanden in afbeeldingen te krijgen tijdens het bouwproces:

COPY /home/me/my-website /var/www/html/. Advertentie

Hier wordt de broncode van de website gekopieerd naar een afbeelding als onderdeel van een build. Dit is een eenmalig proces. Elke container die vanaf de afbeelding wordt gestart, bevat de websitebron zoals deze was op het moment dat u docker build uitvoerde.

docker cp laat je die broncode vervangen door een nieuwere versie zodra een container draait. COPY instructies zijn voor het maken van bestanden onderdeel van een statische afbeelding; cp-opdrachten werken samen met live containers.

Wanneer bestanden kopiëren met Docker?

Het handmatig kopiëren van bestanden van uw host naar een Docker-container, of omgekeerd, zou relatief zeldzaam moeten zijn. Afbeeldingen zijn bedoeld om zelfvoorzienend te zijn, dus ze moeten worden geleverd met alles wat u nodig hebt om een ​​instantie te starten. Configuratie wordt meestal afgehandeld via omgevingsvariabelen.

Containers die gegevens permanent moeten opslaan, moeten Docker-volumes gebruiken. Met volumes kunnen gegevens elke afzonderlijke container overleven, dus u hoeft cp niet handmatig te docken voordat u een instantie vervangt. Wanneer u back-ups maakt, kopieer dan de volumes van uw host, in plaats van bestanden uit containers te halen.

docker cp is vooral handig bij het debuggen van containers of het werken in een ontwikkelomgeving. Soms moet u handmatig een tijdelijk configuratiebestand injecteren of een begraven log tevoorschijn halen. Het gebruik van docker cp is sneller en handiger dan elke keer dat u een codewijziging aanbrengt de hele afbeelding opnieuw op te bouwen.

Onthoud altijd dat bestanden die naar containers worden gekopieerd, alleen blijven bestaan ​​zolang de container leeft. Het starten van een andere container van dezelfde afbeelding geeft je een schone lei, zonder de bestanden die je hebt toegevoegd met docker cp.

Samenvatting

docker cp laat je bestanden verplaatsen tussen uw host en uw Docker-containers. Het werkt met bestanden en mappen, maar mist de meeste geavanceerde functionaliteit in de shell-gebaseerde cp-opdracht.

Advertentie

Regelmatig gebruik van docker cp duidt op een mogelijke afwijking van de best practices voor containers. Het is verstandig om het te beschouwen als een gemakstool voor ontwikkelingsgebruik, in plaats van als een integraal onderdeel van het werken met containers. Bestandspersistentie op lange termijn moet worden geïmplementeerd met volumes, aangezien dit eersteklas componenten zijn in het Docker-ecosysteem.