Moje pytanie dotyczy tego pytania o kopiowanie plików z kontenerów na hosty; Mam plik Dockerfile, który pobiera zależności, kompiluje artefakt kompilacji ze źródła i uruchamia plik wykonywalny. Chcę również skopiować artefakt kompilacji (w moim przypadku jest to .zip
wyprodukowany przez sbt dist
'../ target / `, ale myślę, że to pytanie dotyczy również słoików, plików binarnych itp.
docker cp
działa na kontenerach, a nie na obrazach; czy muszę uruchomić kontener tylko po to, aby pobrać z niego plik? W skrypcie próbowałem uruchomić /bin/bash
w tle w trybie interaktywnym, kopiując plik, a następnie zabijając kontener, ale wydaje się to niezdarne. Czy jest lepszy sposób?
Z drugiej strony chciałbym uniknąć rozpakowywania .tar
pliku po uruchomieniu docker save $IMAGENAME
tylko po to, aby wyjąć jeden plik (ale wydaje się to obecnie najprostszą, jeśli najwolniejszą opcją).
Użyłbym woluminów dockera, np .:
docker run -v hostdir:out $IMAGENAME /bin/cp/../blah.zip /out
ale pracuję boot2docker
w systemie OSX i nie wiem, jak bezpośrednio pisać do systemu plików hosta Mac (woluminy do odczytu i zapisu są montowane w mojej maszynie wirtualnej boot2docker, co oznacza, że nie mogę łatwo udostępnić skryptu do wyodrębnienia blah.zip
z obrazu inni.
źródło
create
dodano / usunięto z polecenia (nie ma go w wersji 1.01)docker create
został wprowadzony w dockerzedocker cp $id:path > local-tar-file
działało idealnie.Niestety wydaje się, że nie ma sposobu na kopiowanie plików bezpośrednio z obrazów Dockera. Najpierw musisz utworzyć kontener, a następnie skopiować plik z kontenera.
Jeśli jednak twój obraz zawiera
cat
polecenie (i tak będzie w wielu przypadkach), możesz to zrobić za pomocą jednego polecenia:Jeśli twój obraz nie zawiera
cat
, po prostu utwórz kontener i użyjdocker cp
polecenia zgodnie z sugestią Igora.źródło
Znacznie szybszą opcją jest skopiowanie pliku z uruchomionego kontenera do zamontowanego woluminu:
** VS **
źródło
cat a >b
vscp a b
ma podobne czasy, jak pokazano tutaj. Ponadto, jeśli ścieżka źródłowa i ścieżka docelowa znajdują się w różnych systemach plików, oba przykłady będą prowadzić do pełnej kopii bajt po bajcie.Komentarz rodziców już pokazał, jak używać cat . Możesz także użyć smoły w podobny sposób:
źródło
docker run --rm --entrypoint tar _image_ cC _img_directory_ . | tar xvC _host_directory_
chciałem dostarczyć rozwiązanie oparte na jednej linii oparte na czystej funkcjonalności Dockera (bez konieczności bash)
edycja: kontener nie musi nawet być uruchamiany w tym rozwiązaniu
źródło
Kolejna (krótka) odpowiedź na ten problem:
Aktualizacja - jak zauważył @Elytscha Smith, działa to tylko wtedy, gdy twój obraz ma wbudowany bash
źródło
Używam boot2dockera na MacOS. Zapewniam, że skrypty oparte na „docker cp” są przenośne. Ponieważ każde polecenie jest przekazywane wewnątrz boot2docker, ale następnie strumień binarny jest przekazywany z powrotem do klienta wiersza poleceń docker działającego na twoim Macu. Zatem operacje zapisu z klienta docker są wykonywane wewnątrz serwera i zapisywane z powrotem do wykonującej instancji klienta!
Udostępniam skrypt kopii zapasowej dla woluminów dockera z dowolnym kontenerem docker, który udostępniam, a moje skrypty kopii zapasowych są testowane zarówno na Linuksie, jak i MacOS z boot2docker. Kopie zapasowe można łatwo wymieniać między platformami. Zasadniczo wykonuję następujące polecenie w moim skrypcie:
Przeniosłem już archiwa między kontenerem Linuksa a moim kontenerem Mac bez żadnych zmian w skrypcie tworzenia kopii zapasowych lub przywracania. Jeśli tego właśnie oczekujesz, cały skrypt znajdziesz tutaj - tutorial: blacklabelops / jenkins
źródło
Można powiązać lokalną ścieżkę na hoście ze ścieżką w kontenerze, a następnie
cp
żądane pliki z tą ścieżką na końcu skryptu.Wtedy nie ma potrzeby późniejszego kopiowania.
źródło