再インポートされたdocker image / containerからの「コマンドが指定されていません」


16

あるマシンからdockerコンテナを取得して別のマシンで実行しようとすると、「デーモンからのエラー応答:コマンドが指定されていません」というエラーが発生します

以下は、問題を示す簡単な例です。

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)、そこから新しいコンテナを実行します。失敗します。

回答:


16

docker exportコンテナに関するすべてをエクスポートするのではなく、ファイルシステムのみをエクスポートします。そのため、ダンプを新しいドッカーイメージにインポートして戻す場合、追加のフラグを指定してコンテキストを再作成する必要があります。

たとえば、イメージの作成に使用されたDockerfileに元のコンテナーが含まれていたために元のコンテナーが正常に実行されていCMD ["/usr/bin/supervisord"]た場合、ダンプを次のようにインポートします。

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

2
docker inspect imagename:tagnameオリジナルとインポートされたものを比較して実行できます。私は運がなかったimport/ exportそして--changeすべてがと罰金を動作しますが、save/ load
イヤカム

2

dockerをエクスポートおよびインポートしようとしたときにこのエラーが発生しました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

1

コンテナをエクスポートすると、画像レイヤーとメタデータを含む独自の履歴が失われました。そのため、コンテナはpid状態を失いました。

すべてのコンテナには初期(ルート)プロセスが必要です。dockerfileのデフォルトのエントリポイントをbashとしてオーバーライドしています。[編集]あなたがそれをオーバーライドしていけないのは、ubuntuベースイメージで定義されていないdefaultを使用していると思います。したがって、cmdコマンドで初期プロセスを開始する必要があります。バグはないと思います。これは、再利用のためのdockerfile機能です。


元の問題のみの回避策のエントリポイントをオーバーライドしています。エクスポート/インポート中にオーバーライドされるものはありません。
グリーンドレイク

こんにちは@DrakeES私の答えが更新されました。コンテナをエクスポートするとどうなるか説明します。
pmoksuz

0

これらの追加手順で動作するようになりました:

  1. 次のようにDockerfileを作成します。

    FROM ubuntu:imported
    ENTRYPOINT bash
    
  2. 新しいイメージを作成します。

    docker build -t ubuntu:importedwithdockerfile .
    
  3. これで実行されます:

    docker run --name u1 -dit ubuntu:importedwithdockerfile
    

ただし、単純にエクスポートしてインポートした画像がすぐに機能しない理由はまだ不明です。これはバグですか?


-1

docker loadコマンドを使用して、アーカイブファイルからイメージをロードできます。このコマンドは、画像ファイルと引数を一緒にインポートします。


1
この場合の「アーカイブ」ファイルとは何ですか?
グリーンドレイク

2
@Greendrake docker loadおよびdocker saveコンテナーイメージ(コンテナーの作成元)に対する操作、一方docker importdocker exportコンテナーに対する操作。
マイケルハンプトン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.