Docker'da mevcut bir adlandırılmış birime veri eklemenin doğru yolu nedir?


91

Docker'ı bir hacim kapsayıcısı ile eski şekilde kullanıyordum:

docker run -d --name jenkins-data jenkins:tag echo "data-only container for Jenkins"

Ama şimdi adlandırılmış bir birim oluşturarak yeni yola geçtim:

 docker volume create --name my-jenkins-volume 

Bu yeni cildi yeni bir Jenkins konteynerine bağladım. Bıraktığım tek şey, elimde bulunan bir klasör/var/jenkins_home önceki jenkins konteynırımın . (kullanarak docker cp) Şimdi yeni adlandırılmış birimimi bu klasörün içeriğiyle doldurmak istiyorum.

Bu klasörün içeriğini sadece içine kopyalayabilir miyim /var/lib/jenkins/volume/my-jenkins-volume/_data?

Yanıtlar:


141

Sen olabilir kesinlikle doğrudan içine veri kopyalamak /var/lib/docker/volumes/my-jenkins-volume/_data, ancak bunu yaparak şunlardır:

  • Docker ana bilgisayarına fiziksel erişime güvenerek. Uzak bir docker api ile etkileşim kuruyorsanız bu teknik işe yaramaz.

  • Hacim uygulamasının belirli bir yönüne güvenmek, gelecekte buna bağlı olan tüm süreçleri bozarak değişebilir.

Docker api'yi kullanarak komut satırı istemcisi aracılığıyla gerçekleştirebileceğiniz şeylere güvenmenin daha iyi olacağını düşünüyorum. En kolay çözüm muhtemelen aşağıdaki gibi bir yardımcı kap kullanmaktır:

docker run -v my-jenkins-volume:/data --name helper busybox true
docker cp . helper:/data
docker rm helper

3
İkinci merminizle ilgili olarak, docker volume inspect my-jenkins-volume --format '{{.Mountpoint}}'fiziksel konumunu programlı olarak elde etmek için koşabilirsiniz . Yine de harika bir fikir gibi gelmiyor.
c24w

9
Bu yardımcı konteynerin gerçekten çalışması gerekmez. Basitçe yaratmak, sonra çalıştırmak docker cpve sonra kaldırmak yeterli olacaktır.
Alex

Sonuçları görmek veya dosyaları manuel olarak değiştirmek için bu kapsayıcıda yürütülemezsiniz.
CodeOrElse

3
Mac için Docker/var/lib/docker/volumes/my-jenkins-volume/_data kullanırken listelemenin çalışmadığını unutmayın çünkü dosyalar xhyve sanal makinesinin içinde saklanır . Bkz forums.docker.com/t/var-lib-docker-does-not-exist-on-host/18314
Ortomala Lokni

1
Doğru burada açıklanmıştır stackoverflow.com/questions/29762231/…
Zuabi

32

Kabul edilen yanıtı bir satıra indirgeyebilirsiniz, örn.

docker run --rm -v `pwd`:/src -v my-jenkins-volume:/data busybox cp -r /src /data

1
/ tmp'nin geçici doğasının, konteynerin cp tamamlanmadan önce verilerinizi silme riski oluşturup oluşturmayacağını merak ediyorum. pathname.com/fhs/pub/fhs-2.3.html#TMPTEMPORARYFILES
thurt

1
Bağlantı, / tmp içindeki dosyaların yaşam süresini gerçekten netleştirmez. Ben şunu söylüyorum: "Programlar, / tmp içindeki herhangi bir dosya veya dizinin programın çağrıları arasında korunduğunu varsaymamalıdır." Bu, dosyaların hayatta kalacağını ima eder, ancak bu bir garantidir. Docker için -v seçeneği, eğer yoksa, kapsayıcıda bir dizin yaratacaktır, bu nedenle, bu potansiyel yarış durumu hakkında endişeleniyorsanız, / tmp / src'yi / src olarak değiştirmek işe yarayacaktır. Olumsuz tarafı olmadığı için cevabı bunu yansıtacak şekilde düzenleyeceğim.
headdab

3
gelmez -v `pwd`:/srckomut ana bilgisayarda çalıştığını ima? ( pwdÖrneğin farklı bir makineyse ana bilgisayar haritası nasıl olabilir ? - olamaz.) Docker komutu ana bilgisayarda çalışmıyorsa bu çalışmaz. Sanırım bu yüzden docker cp'ye sahibiz. Bu, docker için "yol" değil gibi görünüyor - sadece docker komutu ana bilgisayarda çalışırken çalışan özel bir durumdur. Doğru anlıyor muyum?
Wyck

Evet, haklı olduğunu düşünüyorum. pwdana makinedeki bir dosyaya çözümlenmelidir. Docker'ın bağlama belgelerinden: "Bağlama bağlamaları durumunda, ilk alan ana makinedeki dosya veya dizine giden yoldur."
headdab

1
Bu nedenle, bu kopyalamak için çalışmaz senin kabın içine yerel dosyaları eğer sen montaj gibi, uzaktaki bir konakta pwdbile uzak ana var gerekmez hangi. Bunun yerine, Dmytro Melnychuk'un çözümü (create + cp + rm) yerel olanları nerede çalışırsa çalışsın kapsayıcıya kopyalar.
Xavi Montero

27

Halihazırda var olan adlandırılmış birime veri eklemek için bir kap başlatmanıza gerek yoktur, sadece bir kap oluşturun ve verileri oraya kopyalayın:

docker container create --name temp -v my-jenkins-volume:/data busybox
docker cp . temp:/data
docker rm temp

2
Meşgul kutusunun içeriğine gerçekten ihtiyaç duyulmaması koşuluyla; bunu ile yapabilirsiniz hello-worldve o da işe yarar. busybox1,22 MB. Bunun yerine hello-world13.3kB'dir. Soru şudur: Dockerfile'ı sıfırdan yapabildiğimiz gibi, sadece birimi "bağlamak" istediğimiz ve konteyneri asla başlatmayacağımız için, imaj olarak "hiçbir şey" ile "docker container yaratma" yapabilir miyiz?
Xavi Montero

1
Üstünden bu çözüm için 1 olarak ancak doğru sözdizimi docker cpolandocker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
Marco Dufal

4

İşte ~ / data içeriğini my-vol adlı docker birimine kopyalamak için adımlar

Adım 1. Birimi "geçici" bir kaba ekleyin. Terminalde çalıştırmak için bu komut:

docker run --rm -it --name alpine --mount type=volume,source=my-vol,target=/data alpine

Adım 2. ~ / data içeriğini my-vol içine kopyalayın . Bunun için bu komutları yeni terminal penceresinde çalıştırın:

cd ~/data docker cp . alpine:/data

Bu içeriğini kopyalar verileri ~ / içine my-hac hacmi. Kopyalamadan sonra geçici kapsayıcıdan çıkın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.