web-dev-qa-db-ja.com

--tagを指定したDockerビルドコマンドで画像にタグを付けることができない

ローカルで利用可能なDockerfileを使用してDockerイメージを構築しようとしています。

docker build -t newimage .

私は以前にもこのコマンドを複数回使用しましたが、どういうわけか現在は機能しておらず、その理由を見つけられません。

誰かが問題を探すために可能な解決策または可能な領域で私を助けることができるなら、私は本当に役に立ちます。

私はすでに関連している可能性のある他の投稿を見ていました: Docker build tag repository name

16
Harshil

はい!問題の理由がわかりました。

ドッカー構築プロセス

Dockerイメージを作成すると、イメージの作成中に、他のいくつかの中間イメージがプロセスで生成されます。次の中間画像が生成されると、以前の画像が削除されるため、docker imagesにそれらが表示されることはありません。

-tまたは--tagを使用して提供するタグは最終ビルド用であり、同じタグが付けられた中間コンテナーはありません。

問題の説明

DockerfileでDockerイメージをビルドしようとすると、Successfully built image with IMAGEIDのような同様のメッセージが表示されてプロセスが正常に完了しない場合があります

したがって、失敗したビルドがdocker imagesにリストされないことは明らかです

これで、タグ<none>の画像が他の画像(中間)になります。これにより、イメージは存在するがタグはないという混乱が生じますが、イメージは実際には最終ビルドのあるべきものではないため、タグ付けされていません。

18
Harshil

この場合のウォークアラウンドソリューションの1つとして、他のすべてのイメージがすでにタグ付けされている場合は、ビルドコマンドの直後に以下のコマンドを実行します。

docker tag $(docker image ls | grep "<none>" | awk '{print $3}') newimage:latest

私が知っているように、これはLinux OSでのみ機能します。

1
vugar_saleh

Dockerには何の問題もありません。

画像には複数のタグを付けることができます。

Alpine    3.4      4e38e38c8ce0        6 weeks ago         4.799 MB
Alpine    latest   4e38e38c8ce0        6 weeks ago         4.799 MB

この例では、IDが4e38e38c8ce0の画像にAlpine:latestおよびAlpine:3.4のタグが付けられています。 docker build -t Alpine .を実行すると、latestタグがイメージ4e38e38c8ce0から削除され、新しくビルドされたイメージ(異なるIDを持つ)に割り当てられます。

画像から最後のtagを削除しても、画像は自動的には削除されません。 <none>として表示されます。

Dockerもキャッシュを使用します。したがって、Dockerfileでイメージをビルドし、そのファイルを変更して、イメージを再度ビルドすると、変更を元に戻して再度ビルドすると、2つのイメージができます。最初と最後のステップでビルドしたイメージは同じです。 2番目の画像は「タグ付け」されます<none>

イメージの複数のバージョンを保持する場合は、docker build -tを使用しますtag:versionimage:tag .どこ versiontagは、変更を加えるたびに変更されます。

編集:私がタグと呼んだものは実際にはイメージ名で、バージョンを呼んだものはタグと呼ばれます: https://docs.docker .com/engine/reference/commandline/tag /

1
Martin