„Nie określono polecenia” z ponownie zaimportowanego obrazu dokera / kontenera

16

Próbuję pobrać kontener dokujący z jednego komputera i uruchomić go na innym i napotkałem błąd: „ Odpowiedź błędu od demona: Nie określono polecenia ”.

Poniżej znajduje się uproszczony przykład pokazujący problem:

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.

W tym przykładzie najpierw pobieramy obraz (ubuntu) i z powodzeniem tworzymy / uruchamiamy u1z niego kontener . Następnie eksportujemy ten kontener do pliku ( exported), zatrzymujemy / usuwamy kontener, importujemy plik do nowego obrazu ( ubuntu:imported) i próbujemy uruchomić z niego nowy kontener. To nie wyszło.

Greendrake
źródło

Odpowiedzi:

18

docker exportnie eksportuje wszystkiego o kontenerze - tylko system plików. Dlatego podczas importowania zrzutu z powrotem do nowego obrazu dokera należy określić dodatkowe flagi, aby odtworzyć kontekst.

Na przykład, jeśli oryginalny kontener działał poprawnie, ponieważ plik Docker, który został użyty do utworzenia jego obrazu, miał CMD ["/usr/bin/supervisord"]go w sobie, to zaimportuj zrzut w ten sposób:

docker import \
--change 'CMD ["/usr/bin/supervisord"]' \
path/to/dump.tar imagename:tagname
Greendrake
źródło
2
Możesz uruchomić docker inspect imagename:tagnameporównanie oryginału i tego zaimportowanego. Nie miałem szczęścia z import/ exporti --changechociaż wszystko działa dobrze z save/ load.
kamera na uchu
2

Wystąpił ten błąd podczas próby eksportowania i importowania okna dokowanego microsoft/mssql-server-linux.

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

Polecenia do eksportu i importu:

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

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

Nie mogliśmy jednak znaleźć polecenia, aby je uruchomić. Rozwiązaniem było wyświetlenie wszystkich kontenerów na maszynie eksportującej i sprawdzenie uruchomionego polecenia.

docker ps

wprowadź opis zdjęcia tutaj

Stamtąd możemy dowiedzieć się, jak uruchomić poprawne polecenie:

docker run --name msSQL -p 1401:1433 -d mssql:latest /opt/mssql/bin/sqlservr
Ogglas
źródło
1

Podczas eksportowania kontenera utracił on własną historię, która zawiera warstwy obrazu i metadane. Twój kontener stracił więc swoje stany pid.

Każdy kontener powinien mieć proces początkowy (root). Nadpisujesz domyślny punkt wejścia w pliku docker jako bash. [edytowany] Myślę, że nawet ty nie przesłonisz, używa domyślnego, nie zdefiniowanego w podstawowym obrazie ubuntu. Powinieneś więc rozpocząć swój początkowy proces poleceniem cmd. Myślę, że nie ma błędu. Jest to funkcja pliku dokowanego umożliwiająca ponowne użycie.

pmoksuz
źródło
Zastępuję punkt wejścia w obejściu tylko oryginalnego problemu. Podczas eksportu / importu nic nie jest zastępowane.
Greendrake,
Cześć @DrakeES Moja odpowiedź właśnie została zaktualizowana. Wyjaśniam, co się stanie, gdy eksportujesz kontener.
pmoksuz
0

Pracuję z następującymi dodatkowymi krokami:

  1. Utwórz plik Docker w następujący sposób:

    FROM ubuntu:imported
    ENTRYPOINT bash
    
  2. Zbuduj nowy obraz:

    docker build -t ubuntu:importedwithdockerfile .
    
  3. Teraz będzie działać:

    docker run --name u1 -dit ubuntu:importedwithdockerfile
    

Jednak nadal nie jest jasne, dlaczego po prostu eksportowany, a następnie importowany obraz nie działa od razu. Czy to błąd?

030
źródło
-1

możesz użyć docker loadpolecenia, aby załadować obrazy z pliku archiwum. to polecenie zaimportuje plik obrazu i argumenty razem.

Jian Pei
źródło
1
Co to jest plik „archiwum” w tym przypadku i jak go utworzyć?
Greendrake
2
@Greendrake docker loadi docker saveoperuj na obrazach kontenerów (z których tworzone są kontenery), podczas gdy docker importi docker exportoperuj na kontenerach.
Michael Hampton