Dockerイメージのうちlatestタグがついているものをすべて最新に更新する

Bash,Docker

はじめに

Docker イメージを取得する際にタグを指定しなかった場合には latest タグが自動的に利用されます。

例えば以下の二つのコマンドは両方とも同じ意味を示します。

# latestタグなし
$ docker pull bash

# latestタグ有り
$ docker pull bash:latest

latest タグ付きのイメージは Docker のイメージリポジトリ(DockerHub が利用されることが多いですね)が更新されてもローカルのキャッシュが利用されるため差異が発生する可能性があります。

これを避けるためにローカル PC 内にある Docker イメージを、Docker Repository の最新のイメージから一括で更新するためのコマンドを紹介します。

検証環境

$ uname -moi
x86_64 MacBookPro16,1 Darwin

$ bash -version | head -n 1
GNU bash, version 5.0.18(1)-release (x86_64-apple-darwin19.5.0)

前提条件

  • 作業用 PC で docker コマンドが利用できること。

イメージ一括更新コマンド

以下のコマンドを作業用 PC で実行するだけです。

$ docker images --format "{{.Repository}}:{{.Tag}}" | grep ':latest' | xargs -L1 docker pull

ローカル PC にある Docker イメージの中から latest というタグが付与されているものを一覧取得してひとつずつ docker pull します。

  1. ローカル PC の Docker イメージ(タグ付き)の名前を一覧出力
  2. grep コマンドで latest タグ付きのものだけに絞り込み
  3. xargs -L1 で 1 イメージずつ、 docker pull xxxx を実行

注意

注意点が一つあります。
Doxker イメージはローカル PC でビルドすることができますが、必ずしもリモートの Docker リポジトリに PUSH しているわけがありません。

今回紹介したコマンドはローカルにある latest タグ付きの Docker イメージがリモートの Docker リポジトリに存在するかどうかはチェックしていません。
したがってリモートから取得しようとしてエラーが発生するイメージが散見される可能性があります。

# 下の実行ログを見ると、先頭5行はDocker Composeで作成されたローカルPCにしかないDockerイメージであるため、 docker pullに失敗している。
# 6行目からは成功している。
Error response from daemon: pull access denied for kanji_wordpress, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
Error response from daemon: pull access denied for work_wordpress, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
Error response from daemon: pull access denied for kanji_web, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
Error response from daemon: pull access denied for golly_web, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
Error response from daemon: pull access denied for hyakuninissyu_web, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
latest: Pulling from genzouw/hey
Digest: sha256:c766841ea5896ee6b045c6f268d661e81e86878bdfce55bdecba5987e3d55524
Status: Image is up to date for genzouw/hey:latest
docker.io/genzouw/hey:latest
latest: Pulling from library/node
1e987daa2432: Already exists
a0edb687a3da: Already exists
6891892cc2ec: Already exists
6

とはいえリモートリポジトリに該当するどっかイメージがありませんというエラーメッセージが出るだけで何か悪さをするわけではないので気にせず実行して頂いて構いません。

ひとこと

latest タブを避けるようにするのがベストプラクティスとはいえローカルでちょっと Ubuntu の Docker イメージを動かしたい!といった場合にはタグ指定を省略するため、latest タグイメージがダウンロードされることはあります。

まれにですが特定の latest タグイメージに不具合があり正常に動作しない、といったこともありますので、そんなときには今回のコマンドで更新すると解決する場合があります。

Bash,Docker