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