Zastanawiam się nad użyciem Dockera do zbudowania moich zależności na serwerze Continuous Integration (CI), aby nie musiałem instalować wszystkich środowisk wykonawczych i bibliotek na samych agentach.
Aby to osiągnąć, musiałbym skopiować artefakty kompilacji wbudowane w kontener z powrotem do hosta. Czy to jest możliwe?
docker
docker-container
file-copying
użytkownik2668128
źródło
źródło
Odpowiedzi:
Aby skopiować plik z kontenera na host, możesz użyć polecenia
Oto przykład:
Tutaj goofy_roentgen to nazwa kontenera, którą otrzymałem z następującego polecenia:
Możesz także użyć (części) identyfikatora kontenera . Poniższe polecenie jest równoważne pierwszemu
źródło
docker ps -alq
.docker cp ...
docker cp -L
skopiować dowiązania symboliczneNie musisz używać
docker run
.Możesz to zrobić za pomocą
docker create
.Z dokumentów :
Możesz więc:
Tutaj nigdy nie uruchamiasz kontenera. To wyglądało na korzystne dla mnie.
źródło
-ti
wymagane ibash
wymagane?Zamontuj „wolumin” i skopiuj tam artefakty:
Następnie, gdy kompilacja się kończy, a kontener już nie działa, skopiował już artefakty z kompilacji do
artifacts
katalogu na hoście.Edytować
Ostrzeżenie: po wykonaniu tej czynności możesz napotkać problemy z identyfikatorem użytkownika dokera odpowiadającym identyfikatorowi bieżącego działającego użytkownika. Oznacza to, że pliki w
/artifacts
będą wyświetlane jako posiadane przez użytkownika z identyfikatorem UID użytkownika użytego w kontenerze dokera. Rozwiązaniem może być użycie identyfikatora UID użytkownika wywołującego:źródło
chown
polecenia, aby dopasować identyfikator użytkownika i identyfikator grupy na komputerze hosta.Zamontuj wolumin, skopiuj artefakty, dostosuj identyfikator właściciela i identyfikator grupy:
źródło
TLDR;
Opis
docker run
z woluminem hosta,chown
artefaktem,cp
artefaktem do woluminu hosta:Ta sztuczka działa, ponieważ
chown
wywoływanie w heredoc zajmuje$(id -u):$(id -g)
wartości spoza działającego kontenera; tzn. host dokera.Korzyści to:
docker container run --name
lubdocker container create --name
wcześniejdocker container rm
późniejźródło
cp
odpowiedzi opartych na wolumenie. Również w przypadkuid
podstępu własnościowego czasami jest to prawdziwy ból głowyWiększość odpowiedzi nie wskazuje, że kontener musi uruchomić się, zanim
docker cp
zadziała:źródło
Windows Hyper-V
, najwyraźniej konieczne jest zatrzymanie kontenera przed skopiowaniem pliku .Jeśli nie masz działającego kontenera, tylko obraz i zakładając, że chcesz skopiować tylko plik tekstowy, możesz zrobić coś takiego:
źródło
Publikuję to dla każdego, kto korzysta z Docker na Maca. Oto, co zadziałało dla mnie:
Zauważ, że kiedy montuję,
-v
tenbackup
katalog jest tworzony automatycznie.Mam nadzieję, że kiedyś to się przyda. :)
źródło
volumes
polecenie w katalogu głównym config.yml, aby woluminy były dostępne dla wielu kontenerów.Jeśli chcesz tylko pobrać plik z obrazu (zamiast działającego kontenera), możesz to zrobić:
docker run --rm <image> cat <source> > <local_dest>
Spowoduje to wyświetlenie kontenera, zapisanie nowego pliku, a następnie usunięcie kontenera. Wadą jest jednak to, że uprawnienia do plików i data modyfikacji nie zostaną zachowane.
źródło
https://docs.docker.com/engine/reference/commandline/run/ https://docs.docker.com/engine/reference/commandline/cp/
źródło
Wraz z wydaniem Dockera 19.03 możesz pominąć tworzenie kontenera, a nawet budowanie obrazu. W kompilacjach opartych na BuildKit dostępna jest opcja zmiany miejsca docelowego. Możesz użyć tego do zapisania wyników kompilacji do lokalnego katalogu zamiast do obrazu. Np. Oto wersja binarna go:
Z powyższego pliku Docker tworzę
artifact
scenę, która zawiera tylko pliki, które chcę wyeksportować. A nowo wprowadzona--output
flaga pozwala mi zapisać je do lokalnego katalogu zamiast obrazu. Należy to wykonać za pomocą silnika BuildKit dostarczanego z wersją 19.03:Po zakończeniu kompilacji
app
plik binarny został wyeksportowany:Docker ma inne opcje
--output
flagi opisane w repozytorium BuildKit: https://github.com/moby/buildkit#outputźródło
Bardziej ogólnym rozwiązaniem jest wtyczka CloudBees do Jenkinsa do wbudowania w pojemnik Docker . Możesz wybrać obraz do użycia z rejestru Docker lub zdefiniować plik Docker do kompilacji i użycia.
Zamontuje obszar roboczy do kontenera jako wolumin (z odpowiednim użytkownikiem), ustawi go jako katalog roboczy, wykona dowolne polecenia (wewnątrz kontenera). Aby to zrobić, możesz również użyć wtyczki dokującej przepływu pracy (jeśli wolisz kod niż interfejs użytkownika) za pomocą komendy image.inside () {}.
Zasadniczo wszystko to, upieczone na serwerze CI / CD, a potem trochę.
źródło
Użyłem PowerShell (Admin) z tym poleceniem.
Przykład
źródło
Inną dobrą opcją jest najpierw zbudowanie kontenera, a następnie uruchomienie go za pomocą flagi -c z interpreterem powłoki w celu wykonania niektórych poleceń
Powyższe polecenie robi to:
-i = uruchom kontener w trybie interaktywnym
--rm = usunął pojemnik po wykonaniu.
-v = udostępnił folder jako wolumin ze ścieżki hosta do ścieżki kontenera.
Wreszcie, / bin / sh -c pozwala wprowadzić polecenie jako parametr, które to polecenie skopiuje twoje pliki zadań domowych do ścieżki kontenera.
Mam nadzieję, że ta dodatkowa odpowiedź może ci pomóc
źródło
Utwórz katalog danych w systemie hosta (poza kontenerem) i podłącz go do katalogu widocznego z wnętrza kontenera. To umieszcza pliki w znanej lokalizacji w systemie hosta i ułatwia dostęp do plików narzędziom i aplikacjom w systemie hosta
źródło
Utwórz ścieżkę, w której chcesz skopiować plik, a następnie użyj:
źródło
Możesz użyć
bind
zamiast,volume
jeśli chcesz zamontować tylko jeden folder, nie tworząc specjalnego magazynu dla kontenera:Zbuduj swój obraz za pomocą tagu:
docker build . -t <image>
Uruchom obraz i powiąż bieżący katalog $ (pwd), w którym przechowuje app.py, i zamapuj go na / root / example / wewnątrz kontenera.
docker run --mount type=bind,source="$(pwd)",target=/root/example/ <image> python app.py
źródło
Można to również zrobić w zestawie SDK, na przykład python. Jeśli masz już zbudowany kontener, możesz wyszukać nazwę za pomocą konsoli (
docker ps -a
). Nazwa wydaje się być pewnym połączeniem naukowca i przymiotnika (tj. „Zrelaksowany_pasteur”).Sprawdź
help(container.get_archive)
:Więc wtedy coś takiego wyciągnie się ze wskazanej ścieżki (/ wyjścia) w kontenerze na maszynę hosta i rozpakuje tar.
źródło