Görüntüyü çalıştırmak zorunda kalmadan Docker görüntüsündeki bir dosyayı ayıklamak istiyorum.
Bu docker save
seçenek, belirli bir dosyayı kaldırmak için çok büyük bir dosya tasarrufu sağladığından, benim için şu anda uygun bir seçenek değil.
Görüntüyü çalıştırmak zorunda kalmadan Docker görüntüsündeki bir dosyayı ayıklamak istiyorum.
Bu docker save
seçenek, belirli bir dosyayı kaldırmak için çok büyük bir dosya tasarrufu sağladığından, benim için şu anda uygun bir seçenek değil.
Yanıtlar:
Bir resimdeki dosyaları aşağıdaki komutlarla çıkarabilirsiniz:
docker create $image # returns container ID
docker cp $container_id:$source_path $destination_path
docker rm $container_id
docker create
Belgelere göre , bu konteyner çalıştırmaz:
docker create
Komut Belirtilen resmin üzerine yazılabilir bir konteyner tabakası oluşturur ve belirli bir komutu çalıştırmak için hazırlar. Konteyner kimliği daha sonra basılırSTDOUT
. Bu,docker run -d
kabın hiçbir zaman başlatılmaması haricinde benzer .docker start <container_id>
Konteyneri herhangi bir noktada başlatmak için bu komutu kullanabilirsiniz .
Başvuru için (önceki cevabım), bir görüntüden bir dosyayı çıkarmanın daha az etkili bir yolu şudur:
docker run some_image cat $file_path > $output_path
docker run --entrypoint /bin/sh my_image -c /bin/cat some_file
Yukarıdakilerin hiçbiri benim için çalıştı. Tam çalışma komutu:
docker run --rm --entrypoint /bin/sh image_name -c "cat /path/filename" > output_filename
Tırnaklar cat
olmadan dosya adı olmadan geçilir, bu nedenle ne gösterileceğini bilmez. Ayrıca komut tamamlandıktan sonra kabı silmek iyi bir fikirdir.
Yanılmıyorsam, liman konteynerlerinin Ubuntu için aşağıdaki dizinde oluşturulan önbelleğe alınmış dosyaları depoladığını düşünüyorum:
/var/lib/docker/aufs/diff/<container_id>
Oradan, dosya sistemine erişebilmeli ve dosyalarınızı alabilmelisiniz.
layersize
ve json
ve ayrıca kullanıcı tarafından okunabilir değildir (kullanıcı docker grubunda olsa bile). /var/lib/docker/aufs/diff
Aradığım dosyayı içerecektir (ancak konteyner kimliğine göre kategorilere ayrılmamıştır) ve ayrıca okunamaz.
/var/lib/docker/aufs
(içindeki tüm dizinlere /var/lib/docker/
Tam çıktısını saklamak docker save
bir seçenek değilse, yalnızca gerekli dosyayı çıkarmak için boru hatları kullanabilirsiniz.
Ne yazık ki, çıktı bir "katran katranı" olduğu için, biraz yinelemeli bir işlem olabilir.
Az önce bir dosyayı çıkarmam gerektiğinde yaptığım şey:
1) En son ilgilendiğiniz dosyanın hangi sürümünde değiştirildiğini (bunun muhtemelen resminize bağlı olduğunu) ve oluşturulduğu / kaydedildiği tarihi belirleyin.
2) docker save
Komutun çıktısından tüm içindekiler tablosunu alın :
docker save IMAGE_NAME | tar -tvf -
3) layer.tar
1. adımda belirlediğiniz resmin tarihine uyan bu komutun çıktısında bulunan | grep layer.tar
dosyaları inceleyin (yalnızca bu dosyaları göstermek için ekleyebilirsiniz )
4) Bu layer.tar
dosyayı standartlara ayıklayın ve içindekiler tablosunu alın:
docker save IMAGE_NAME | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar | tar -tvf -
5) İstediğiniz dosyanın listelendiğini doğrulayın ve adı bulduktan sonra çıkarın:
docker save IMAGE_NAME | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar | tar -xf - PATH/TO/YOUR/FILE
layer.tar
Adım 2/3'te aradığınız tarihle eşleşen birden fazla dosya varsa, doğru olanı bulana kadar her biri için 4. adımı tekrarlamanız gerekebilir.
Büyük harflerle yazılan metni yukarıdaki komutlarda, durumunuz için doğru resim adları, sağlama toplamları ve dosya adlarıyla değiştirin.