«Не указана команда» из повторно импортированного образа / контейнера докера

16

Я пытаюсь взять Docker-контейнер с одного компьютера и запустить его на другом, и обнаружил следующую ошибку: « Ошибка ответа от демона: команда не указана ».

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

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) и пытаемся запустить из него новый контейнер. Это не удается.

Greendrake
источник

Ответы:

16

docker exportне экспортирует все о контейнере - только файловая система. Таким образом, при импорте дампа обратно в новый образ докера необходимо указать дополнительные флаги для воссоздания контекста.

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

docker import \
--change 'CMD ["/usr/bin/supervisord"]' \
path/to/dump.tar imagename:tagname
Greendrake
источник
2
Вы можете запустить docker inspect imagename:tagnameсравнение оригинала и импортированного. Мне не повезло с import/ exportи --change, хотя все отлично работает с save/ load.
наушники
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

Однако мы не смогли найти команду для его запуска. Решением было перечисление всех контейнеров на экспортирующем компьютере и просмотр команды run.

docker ps

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

Оттуда мы могли бы узнать, как выполнить правильную команду:

docker run --name msSQL -p 1401:1433 -d mssql:latest /opt/mssql/bin/sqlservr
Ogglas
источник
1

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

Каждый контейнер должен иметь начальный (корневой) процесс. Вы пересекаете точку входа по умолчанию в файле Docker как bash. [отредактировано] Я думаю, что даже если вы не переопределите, он использует значение по умолчанию, не определенное в базовом образе Ubuntu. Итак, вы должны начать свой начальный процесс с помощью команды cmd. Я думаю, что нет ошибки. Это функция dockerfile для повторного использования.

pmoksuz
источник
Я переопределяю точку входа в обходной путь только к исходной проблеме. Ничто не переопределяется во время экспорта / импорта.
Greendrake
привет @DrakeES мой ответ только что обновился. Я объясняю, что происходит, когда вы экспортируете контейнер.
pmoksuz
0

Получил работу с этими дополнительными шагами:

  1. Создайте Dockerfile следующим образом:

    FROM ubuntu:imported
    ENTRYPOINT bash
    
  2. Создайте новый образ:

    docker build -t ubuntu:importedwithdockerfile .
    
  3. Теперь он будет работать:

    docker run --name u1 -dit ubuntu:importedwithdockerfile
    

Однако до сих пор неясно, почему просто экспортированное, а затем импортированное изображение не работает сразу. Это ошибка?

+030
источник
-1

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

Цзянь Пей
источник
1
Что такое «архивный» файл в этом случае и как его создать?
Greendrake
2
@Greendrake docker loadи docker saveработать с изображениями контейнеров (из которых создаются контейнеры), docker importа также docker exportработать с контейнерами.
Майкл Хэмптон