"Tidak ada perintah yang ditentukan" dari gambar / kontainer docker yang diimpor ulang

16

Saya mencoba mengambil wadah buruh pelabuhan dari satu mesin dan menjalankannya pada mesin lain dan menemukan kesalahan ini: " Respons kesalahan dari daemon: Tidak ada perintah yang ditentukan ".

Di bawah ini adalah contoh sederhana yang menunjukkan masalah:

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.

Dalam contoh itu, pertama-tama kita menarik gambar (ubuntu) dan berhasil membuat / menjalankan wadah u1dari itu. Kemudian kami mengekspor wadah itu ke file ( exported), menghentikan / menghapus wadah, mengimpor file ke gambar baru ( ubuntu:imported) dan mencoba menjalankan wadah baru dari sana. Itu gagal.

Greendrake
sumber

Jawaban:

16

docker exporttidak mengekspor segala sesuatu tentang kontainer - hanya sistem file. Jadi, ketika mengimpor dump kembali ke gambar buruh pelabuhan baru, bendera tambahan perlu ditentukan untuk membuat ulang konteksnya.

Misalnya, jika wadah asli berfungsi dengan baik karena Dockerfile yang digunakan untuk membuat gambarnya ada CMD ["/usr/bin/supervisord"]di dalamnya, maka impor dump Anda dengan cara ini:

docker import \
--change 'CMD ["/usr/bin/supervisord"]' \
path/to/dump.tar imagename:tagname
Greendrake
sumber
2
Anda dapat menjalankan docker inspect imagename:tagnamemembandingkan yang asli dan yang diimpor. Saya tidak beruntung dengan import/ exportdan --change, meskipun semuanya berfungsi baik dengan save/ load.
earcam
2

Mendapat kesalahan ini ketika mencoba untuk mengekspor dan mengimpor buruh pelabuhan microsoft/mssql-server-linux.

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

Perintah untuk mengekspor dan mengimpor:

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

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

Namun kami tidak dapat menemukan perintah untuk menjalankannya. Solusinya adalah daftar semua kontainer pada mesin ekspor dan melihat perintah berlari.

docker ps

masukkan deskripsi gambar di sini

Dari sana kita bisa mengetahui cara menjalankan perintah yang benar:

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

Saat Anda mengekspor wadah, itu kehilangan riwayatnya sendiri yang berisi lapisan gambar dan data meta. Jadi wadah Anda kehilangan status pidnya.

Setiap kontainer harus memiliki proses awal (root). Anda mengesampingkan titik masuk default pada dockerfile sebagai bash. [diedit] Saya pikir bahkan Anda tidak menimpanya menggunakan default, tidak didefinisikan dalam gambar dasar ubuntu. Jadi, Anda harus memulai proses awal Anda dengan perintah cmd. Saya pikir tidak ada bug. Ini adalah fitur dockerfile untuk reusablity.

pmoksuz
sumber
Saya mengesampingkan titik masuk dalam penyelesaian untuk masalah asli saja. Tidak ada yang ditimpa selama ekspor / impor.
Greendrake
hai @Buat jawaban saya baru saja diperbarui. Saya jelaskan apa yang terjadi ketika Anda mengekspor sebuah kontainer.
pmoksuz
0

Mengerjakannya dengan langkah-langkah tambahan ini:

  1. Buat Dockerfile sebagai berikut:

    FROM ubuntu:imported
    ENTRYPOINT bash
    
  2. Bangun gambar baru:

    docker build -t ubuntu:importedwithdockerfile .
    
  3. Sekarang akan berjalan:

    docker run --name u1 -dit ubuntu:importedwithdockerfile
    

Namun, masih belum jelas mengapa hanya mengekspor dan kemudian gambar yang diimpor tidak berfungsi segera. Apakah ini bug?

030
sumber
-1

Anda dapat menggunakan docker loadperintah untuk memuat gambar dari file arsip. perintah ini akan mengimpor file gambar dan argumen bersama.

Jian Pei
sumber
1
Apa itu file "arsip" dalam kasus ini dan bagaimana cara membuatnya?
Greendrake
2
@ Getarkan docker loaddan docker saveoperasikan pada gambar wadah (dari mana wadah dibuat), sementara docker importdan docker exportoperasikan pada wadah.
Michael Hampton