Dockerで名前付きの最新のタグを作成する方法は?


241

タグを付けたい画像があるとし0.10.24ましょう(私の場合はNode.js 0.10.24を含む画像です)。Dockerfileを使用してそのイメージを構築し、実行docker buildして、-tパラメーターを使用してタグを提供しました。

ある日、そのイメージの追加バージョンが存在することを期待しているので、別のタグ名でプロセスを再実行します。

ここまでは順調ですね。これはうまく機能し、すべてが順調です。

しかし、ここから問題が発生しますlatest。また、常に最新の画像タグ付き広告を常に追加したいと考えています。そのため、まったく同じ画像に2つの名前を付ける必要があると思います。

どうすればよいですか?私は本当にdocker buildまったく同じバージョンでもう一度再実行する必要がありますが、今回は別のタグを使用しますが、より良いオプションはありますか?


回答:



161

画像を取得したら、次を使用できます

$ docker tag <image> <newName>/<repoName>:<tagName>
  1. イメージをビルドし、creack / node:latestでタグ付けします。

    $ ID=$(docker build -q -t creack/node .)
    
  2. 新しいタグを追加

    $ docker tag $ID creack/node:0.10.24
    
  3. これを使用して、ビルドから-t部分をスキップできます

    $ docker tag $ID creack/node:latest
    

4
これはもう動作しないようです?ビルドコマンドはイメージIDを返さず、IDには
ビルドログ

14
ビルドログはstderrにあるはずです。githubでバグレポートを開くことができます。それ以外の場合は、-tを使用してビルドするときに、指定されたタグを直接使用して、イメージIDを完全に破棄できます。私の例では、最初の行で画像が生成されcreack/node:latestます。タグを付けることができますdocker tag creack/node:latest creack/node:0.10.24
creack

これは次のようなものとうまく機能しますREV=$(hg identify --num)
analytik

2
最新のタグを適切に機能させるには、おそらくdocker tag -f $ID creack/node:latest最新のものでタグ付けを強制する必要があります(以前のイメージが既に最新の場合)
treaz

4
使用:ID = $(docker build -q -t myrepo / myname:mytag。)。「-q」は、IDのみがstdoutに書き込まれることを意味します。古いブランチを構築している場合でも、 'latest'タグが使用されない場合と同様に、常にタグを指定する必要があります。
David Roussel、2016

44

これが私のbashスクリプトです

docker build -t ${IMAGE}:${VERSION} .
docker tag ${IMAGE}:${VERSION} ${IMAGE}:latest

その後、同じバージョンを再ビルドした場合、タグなしの画像を削除できます

docker rmi $(docker images | grep "^<none>" | awk "{print $3}")

リンク

または

docker rmi $(docker images | grep "^<none>" | tr -s " " | cut -d' ' -f3 | tr '\n' ' ')

または

コマンドをクリーンアップする

Docker 1.13では、クリーンアップコマンドが導入されています。未使用のコンテナ、イメージ、ネットワーク、ボリュームをすべて削除するには:

docker system prune

または個別に:

docker container prune
docker image prune
docker network prune
docker volume prune

私のマシン(Ubuntuの14.04)上でawk '{print $3}'動作しますが、ないawk "{print $3}"ので、コマンドIの使用であるdocker rmi $(docker images -a | grep "^<none>" | awk '{print $3}')
厳しい

1
この-fオプションはには存在しませんdocker tag。使い方はただdocker tag IMAGE[:TAG] IMAGE[:TAG]
jwadsa​​ck

@ 2Fast2BCn:docker pushdocker build & docker runにもする必要があると仮定して、:latestまたはでプッシュし${VERSION}ますか?
Idan Adar 2017年

両方ともプッシュできると思います。とにかく一度だけ保存します。
2Fast2BCn 2017年

19

ID=$(docker build -t creack/node .)IDビルドからの出力が含まれるため、私には機能しません。

だから私はこの小さなBASHスクリプトを使用しています:

#!/bin/bash

set -o pipefail

IMAGE=...your image name...
VERSION=...the version...

docker build -t ${IMAGE}:${VERSION} . | tee build.log || exit 1
ID=$(tail -1 build.log | awk '{print $3;}')
docker tag $ID ${IMAGE}:latest

docker images | grep ${IMAGE}

docker run --rm ${IMAGE}:latest /opt/java7/bin/java -version

1
または、この回答で述べたように-q/ --quietを単に渡すことができますbuild
ドリフトキャッチャー

8

からIDgrepするだけdocker imagesです:

docker build -t creack/node:latest .
ID="$(docker images | grep 'creak/node' | head -n 1 | awk '{print $3}')"
docker tag "$ID" creack/node:0.10.24
docker tag "$ID" creack/node:latest

一時ファイルを必要とせず完全なビルド出力を提供します。それでも/dev/null、ログファイルまたはにリダイレクトできます。


5

アーロンの答えのバリエーション。一時ファイルなしでsedを使用する

#!/bin/bash
VERSION=1.0.0
IMAGE=company/image
ID=$(docker build  -t ${IMAGE}  .  | tail -1 | sed 's/.*Successfully built \(.*\)$/\1/')

docker tag ${ID} ${IMAGE}:${VERSION}
docker tag -f ${ID} ${IMAGE}:latest
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.