“Nenhum comando especificado” da imagem / contêiner do docker reimportado

16

Estou tentando pegar um contêiner do docker de uma máquina e executá-lo em outro e encontrar este erro: " Resposta de erro do daemon: nenhum comando especificado ".

Abaixo está um exemplo simplificado mostrando o problema:

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.

Nesse exemplo, primeiro obtemos uma imagem (ubuntu) e criamos / executamos o contêiner u1com êxito . Em seguida, exportamos esse contêiner para um arquivo ( exported), paramos / removemos o contêiner, importamos o arquivo para uma nova imagem ( ubuntu:imported) e tentamos executar um novo contêiner a partir dele. Falha.

Greendrake
fonte

Respostas:

16

docker exportnão exporta tudo sobre o contêiner - apenas o sistema de arquivos. Portanto, ao importar o dump de volta para uma nova imagem de janela de encaixe, sinalizadores adicionais precisam ser especificados para recriar o contexto.

Por exemplo, se o contêiner original estava funcionando bem porque o Dockerfile usado para criar sua imagem estava CMD ["/usr/bin/supervisord"]nele, importe seu dump desta maneira:

docker import \
--change 'CMD ["/usr/bin/supervisord"]' \
path/to/dump.tar imagename:tagname
Greendrake
fonte
2
Você pode executar docker inspect imagename:tagnamecomparando o original e o importado. Não tive sorte com import/ exporte --change, embora tudo funcione bem com save/ load.
earcam
2

Erro ao tentar exportar e importar janela de encaixe microsoft/mssql-server-linux.

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

Comandos para exportar e importar:

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

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

No entanto, não conseguimos encontrar o comando para executá-lo. A solução estava listando todos os contêineres na máquina de exportação e observando o comando executado.

docker ps

insira a descrição da imagem aqui

A partir daí, descobrimos como executar o comando correto:

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

Quando você exporta um contêiner, ele perde seu próprio histórico, que contém camadas de imagem e metadados. Portanto, seu contêiner perdeu seus estados pid.

Todo contêiner deve ter um processo inicial (raiz). Você está substituindo o ponto de entrada padrão no dockerfile como bash. [editado] Eu acho que mesmo você não o substitui, ele usa o padrão, não definido na imagem base do ubuntu. Portanto, você deve iniciar seu processo inicial com o comando cmd. Eu acho que não há bug. É um recurso de dockerfile para reutilização.

pmoksuz
fonte
Estou substituindo o ponto de entrada na solução alternativa apenas ao problema original. Nada é substituído durante a exportação / importação.
Greendrake
oi @DrakeES minha resposta acabou de atualizar. Explico o que acontece quando você exporta um contêiner.
pmoksuz
0

Trabalhei com estas etapas adicionais:

  1. Crie o Dockerfile da seguinte maneira:

    FROM ubuntu:imported
    ENTRYPOINT bash
    
  2. Crie uma nova imagem:

    docker build -t ubuntu:importedwithdockerfile .
    
  3. Agora ele será executado:

    docker run --name u1 -dit ubuntu:importedwithdockerfile
    

No entanto, ainda não está claro por que a imagem simplesmente exportada e importada não funciona imediatamente. Isso é um inseto?

030
fonte
-1

você pode usar o docker loadcomando para carregar imagens do arquivo morto. este comando importará o arquivo de imagem e os argumentos juntos.

Jian Pei
fonte
1
O que é um arquivo "archive" nesse caso e como criá-lo?
Greendrake
2
@Greendrake docker loade docker saveoperar em imagens de contentores (a partir do qual os recipientes são criadas), enquanto docker importe docker exportoperam em recipientes.
Michael Hampton