“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.

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

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

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.


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?


-1

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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.