Mai mult
Copierea fișierelor din Docker container pentru a găzdui
Am'm de gândire de a folosi Docker să-mi construiesc dependențe pe un Continuous Integration (CI) server, așa că eu nu't trebuie să instalați toate runtime-uri și biblioteci de pe agenții ei înșiși.
Pentru a realiza acest lucru am nevoie pentru a copia construi artefacte care sunt construite în interiorul containerului înapoi în gazdă. Este posibil?
1429
16
Pentru a copia un fișier de la un container la gazdă, puteți folosi comanda
Aici's un exemplu:
Aici goofy_roentgen este numele containerului am primit de la următoarea comandă:
Puteți folosi, de asemenea, (o parte din) Container ID. Următoarea comandă este echivalentă cu prima
Nu aveți nevoie pentru a utiliza
docker run
O poti face cu docker crea`
Din docs Docher crea comandă creează o inscriptibil recipient strat peste imaginea specificată și o pregătește pentru funcționare specificate de comandă. Recipientul ID-ul este apoi tipărite la STDOUT. Acest lucru este similar cu docker run-d, cu excepția recipientului nu este pornit.
Deci, puteți face
Aici, n-ai începe container. Care părea benefic pentru mine.
De montare a "volumul" și copia artefacte într-acolo:
Monta un volum, copiați artefacte, pentru a regla proprietar id-ul și id-ul grupului:
TLDR;
Dacă tu nu't au o funcționare container, doar o imagine, și presupunând că doriți să copiați un fișier text, ai putea face ceva de genul asta:
Cele mai multe dintre răspunsuri nu indică faptul că recipientul trebuie să ruleze înainte de
docker cp
va lucra:Am posta acest lucru pentru oricine care utilizează Docker pentru Mac. Aceasta este ceea ce a lucrat pentru mine:
Rețineți că, atunci când am monta folosind
-v
căbackup
director este creat automat.Sper că acest lucru este util pentru cineva într-o zi. :)
Ca o soluție generală, acolo's o CloudBees plugin pentru Jenkins a construi în interiorul unui container Docker. Puteți selecta o imagine pentru a folosi la un Docher registru sau defini o Dockerfile de a construi și de a folosi.
L'll monta spațiu de lucru în recipient ca un volum (cu utilizare corespunzător), setați-l ca director de lucru, face tot ce poruncește cerere (în interiorul containerului). Puteți folosi, de asemenea, docker-flux de lucru plugin (dacă preferați cod UI) pentru a face acest lucru, cu imaginea.în interiorul() {} comanda.
Practic toate acestea, coapte în CI/CD server și apoi unele.
https://docs.docker.com/engine/reference/commandline/run/ https://docs.docker.com/engine/reference/commandline/cp/
Dacă doriți doar să trageți un fișier dintr-un imagine (în loc de o funcționare container), puteți face acest lucru:
docker termen-rm <imagine> cat <sursa> > <local_dest>
Acest lucru va aduce containerul, scrie noul fișier, apoi scoateți recipientul. Un dezavantaj, cu toate acestea, este că permisiunile de fișiere și a modificat data nu vor fi păstrate.
Am folosit PowerShell (Admin) cu această comandă.
Exemplu
Cu eliberarea de Docker 19.03, puteți sări crearea containerului și chiar construirea unei imagini. Nu's o opțiune cu BuildKit bazat construiește pentru a schimba destinația de ieșire. Puteți utiliza acest pentru a scrie rezultatele construi la directorul local, mai degrabă decât într-o imagine. E. g. aici's a construi un du-te binar:
Din cele de mai sus Dockerfile, am'm construirea
artefact
etapă, care include doar fișierele vreau sa export. Și nou introdus--output
flag-mi permite să scriu cei de la un director local în loc de o imagine. Acest lucru trebuie să fie efectuate cu BuildKit motor care navele cu 19.03:După ce clădirea a fost complet " app " binar fost exportate:
Docker are alte opțiuni pentru
--ieșire
pavilion documentat în amonte BuildKit repo: https://github.com/moby/buildkit#outputA crea o cale în cazul în care doriți să copiați fișierul și apoi utilizați:
Creați un director de date de pe sistemul gazdă (în afara containerului) și muntele asta de la un director vizibil din interiorul containerului. Acest lucru pune fișierele într-o locație cunoscută pe sistemul gazdă, și îl face ușor pentru instrumente și aplicații de pe sistemul gazdă pentru a accesa fișierele
Puteți utiliza
încurcătură
în loc devolum
dacă doriți să montați un singur dosar, nu să creeze speciale de depozitare pentru un recipient:docker construi . -t <imagine>
2. Rula imaginea și se leagă de curent $(pwd) directorul unde app.py magazine și o hartă a /root/exemplu/ în interiorul containerului.docker rula --muntele tip=a lega,sursa="$(pwd)",target=/root/exemplu/ <imagine> python app.py