"Не вказана команда" з повторно імпортованого зображення / контейнера докера


16

Я намагаюся взяти контейнер докера з однієї машини і запустити його на іншій, і зіткнулася з цією помилкою: " Відповідь про помилку від демон: команда не вказана ".

Нижче наведено спрощений приклад, що показує проблему:

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.

У цьому прикладі ми спочатку витягуємо зображення (ubuntu) і успішно створюємо / запускаємо контейнер u1з нього. Потім ми експортуємо цей контейнер у файл ( exported), зупиняємо / видаляємо контейнер, імпортуємо файл у нове зображення ( ubuntu:imported) і намагаємося запустити з нього новий контейнер. Це виходить з ладу.

Відповіді:


18

docker exportне експортує все про контейнер - лише файлову систему. Отже, під час імпортування дампа назад у новий образ докера необхідно вказати додаткові прапори, щоб відтворити контекст.

Наприклад, якщо початковий контейнер працював нормально, оскільки в ньому був Dockerfile, який використовувався для створення його зображення CMD ["/usr/bin/supervisord"], то імпортуйте дамп таким чином:

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

2
Ви можете запустити docker inspect imagename:tagnameпорівняння оригіналу та імпорту. Мені не пощастило з import/ exportі --change, хоча все працює добре з save/ load.
earcam

2

Отримала цю помилку при спробі експорту та імпорту докера microsoft/mssql-server-linux.

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

Команди експорту та імпорту:

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

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

Однак ми не змогли знайти команду для її запуску. Рішення було перерахувати всі контейнери на машині-експортері та переглядати команду, що працює.

docker ps

введіть тут опис зображення

Звідти ми могли дізнатися, як запустити правильну команду:

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

1

Під час експорту контейнера він втратив власну історію, яка містить шари зображень та метадані. Тож ваш контейнер втратив стан підпису.

Кожен контейнер повинен мати початковий (кореневий) процес. Ви переглядаєте за замовчуванням вхідну точку на dockerfile як bash. [відредаговано] Я думаю, що навіть ви не переосмислюєте, він використовує типовий параметр, не визначений в базовому зображенні ubuntu. Отже, ви повинні почати свій початковий процес з командою cmd. Я думаю, що немає помилок. Це функція dockerfile для повторного використання.


Я переосмислюю вхідну точку у вирішенні лише для початкової проблеми. Нічого не скасовується під час експорту / імпорту.
Гріндраке

привіт @DrakeES моя відповідь щойно оновлена. Я пояснюю, що відбувається, коли ви експортуєте контейнер.
pmoksuz

0

Зробив це за допомогою цих додаткових кроків:

  1. Створіть Dockerfile так:

    FROM ubuntu:imported
    ENTRYPOINT bash
    
  2. Створіть нове зображення:

    docker build -t ubuntu:importedwithdockerfile .
    
  3. Тепер він працюватиме:

    docker run --name u1 -dit ubuntu:importedwithdockerfile
    

Однак досі незрозуміло, чому просто експортований, а потім імпортований образ не працює відразу. Це помилка?


-1

Ви можете використовувати docker loadкоманду для завантаження зображень з архівного файлу. ця команда імпортує файл зображення та аргументи разом.


1
Що таке файл "архіву" в цьому випадку і як його створити?
Гріндраке

2
@Greendrake docker loadі docker saveпрацювати на контейнерних зображень (з яких створюються контейнери), в той час , docker importі docker exportпрацювати на контейнерах.
Майкл Хемптон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.