Назад | Перейти на главную страницу

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

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

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

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

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

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

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

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

Получил эту ошибку при попытке экспортировать и импортировать докер 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

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

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

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

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

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

    docker build -t ubuntu:importedwithdockerfile .
    
  3. Теперь он запустится:

    docker run --name u1 -dit ubuntu:importedwithdockerfile
    

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