Yeniden içe aktarılan docker görüntüsü / kapsayıcısından “komut belirtilmedi”


17

Bir makineden bir docker kapsayıcı almak ve başka bir bilgisayarda çalıştırmak ve bu hatayla karşılaşmaya çalışıyorum: " Daemon hata yanıtı: Komut belirtilmedi ".

Aşağıda sorunu gösteren basitleştirilmiş bir örnek verilmiştir:

docker --version
Docker version 1.10.1, build 9e83765
docker pull ubuntu
docker run --name u1 -dit ubuntu:latest
docker export -o exported u1
docker stop u1
docker rm u1
docker import exported ubuntu:imported
docker run --name u1 -dit ubuntu:imported
docker: Error response from daemon: No command specified.

Bu örnekte, önce bir resim çekiyoruz (ubuntu) ve u1ondan başarılı bir şekilde konteyner oluşturuyoruz / çalıştırıyoruz . Sonra bu kapsayıcıyı bir dosyaya ( exported) dışa aktarır, kapsayıcıyı durdurur / kaldırır, dosyayı yeni bir görüntüye ( ubuntu:imported) aktarır ve ondan yeni bir kapsayıcı çalıştırmayı deneriz. Başarısız.

Yanıtlar:


18

docker exportyalnızca dosya sistemi olan kapsayıcı ile ilgili her şeyi dışa aktarmaz. Dolayısıyla, dökümü yeni bir docker görüntüsüne içe aktarırken, içeriği yeniden oluşturmak için ek bayrakların belirtilmesi gerekir.

Örneğin, görüntüsünü oluşturmak için kullanılan Dockerfile içinde bulunduğundan orijinal kapsayıcı düzgün çalışıyorsa CMD ["/usr/bin/supervisord"], dökümünüzü şu şekilde içe aktarın:

docker import \
--change 'CMD ["/usr/bin/supervisord"]' \
path/to/dump.tar imagename:tagname

2
docker inspect imagename:tagnameOrijinal ile içe aktarılanları karşılaştırarak çalıştırabilirsiniz . import/ İle hiç şansım olmadı exportve --changeher şey save/ ile iyi çalışıyor olsa da load.
earcam

2

Bağlantı birimini dışa aktarmaya ve içe aktarmaya çalışırken bu hatayı aldım microsoft/mssql-server-linux.

https://hub.docker.com/r/microsoft/mssql-server-linux/

Dışa ve içe aktarma komutları:

docker export --output "C:\Users\oscar\Desktop\sqlTestMS.tar" msSQL

docker import "C:\Users\oscar\Desktop\sqlTestMS.tar" mssql

Ancak onu çalıştırmak için komut bulamadık. Çözüm, dışa aktarma makinesindeki tüm kapları listeliyordu ve komut çalıştırdı.

docker ps

resim açıklamasını buraya girin

Oradan doğru komutu nasıl çalıştıracağımızı öğrenebiliriz:

docker run --name msSQL -p 1401:1433 -d mssql:latest /opt/mssql/bin/sqlservr

1

Bir kapsayıcıyı dışa aktardığınızda, görüntü katmanları ve meta veriler içeren kendi geçmişini kaybetti. Böylece konteynerin pid durumlarını kaybetti.

Her kap bir başlangıç ​​(kök) işlemine sahip olmalıdır. Dockerfile'daki varsayılan giriş noktasını bash olarak geçersiz kılıyorsunuz. Ben bile ubuntu temel görüntüde tanımlı değil, varsayılan kullanır geçersiz kılmıyorum düşünüyorum. Bu yüzden ilk işleminize cmd komutu ile başlamalısınız. Bence böcek yok. Yeniden kullanılabilirlik için bir dockerfile özelliğidir.


Geçici çözümde giriş noktasını yalnızca özgün soruna geçersiz kılıyorum. Dışa aktarma / içe aktarma sırasında hiçbir şey geçersiz kılınmaz.
Greendrake

merhaba @ Cevabım cevap güncellendi. Bir konteyneri dışa aktardığınızda ne olduğunu açıklıyorum.
pmoksuz

0

Bu ek adımlarla çalışmasını sağladım:

  1. Dockerfile dosyasını aşağıdaki gibi oluşturun:

    FROM ubuntu:imported
    ENTRYPOINT bash
    
  2. Yeni resim oluştur:

    docker build -t ubuntu:importedwithdockerfile .
    
  3. Şimdi çalışacak:

    docker run --name u1 -dit ubuntu:importedwithdockerfile
    

Ancak, neden dışa aktarılan ve sonra içe aktarılan görüntünün neden hemen çalışmadığı hala belirsizdir. Bu bir hata mı?


-1

docker loadarşiv dosyasındaki resimleri yüklemek için komutu kullanabilirsiniz . bu komut resim dosyasını ve bağımsız değişkenleri birlikte alır.


1
Bu durumda "arşiv" dosyası nedir ve nasıl oluşturulur?
Greendrake

2
@Greendrake docker loadve docker save(konteyner, oluşturulan) kap resimleri üzerinde işlem, süre docker importve docker exportkonteyner üzerinde çalışır.
Michael Hampton
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.