hvystnの日記

備忘録です

Rails6 on Dockerの環境構築 - Dockerイメージのバージョン指定

hvystn.hatenablog.com こちらの記事でDockerの公式Quickstartに従い、最低限のRails6の環境を構築しました。
今回はDBとして使用しているPostgreSQLイメージのバージョンを指定します。

なぜDockerイメージのバージョン指定をする必要がありますか?

手を動かす前に、なぜイメージのバージョン指定をするのか、その必要性を考えてみました。

If no tag is provided, Docker Engine uses the :latest tag as a default.

docker pull | Docker Documentation

公式によると、タグがない場合はデフォルトでlatestタグがついたイメージをpullするようです。
今のPostgreSQLのimege設定がちょうどこの状態です。

latestタグでの運用だと不具合がありますか?

実際にlatestタグ運用で不具合があるか調べてみました。

別の作業中、管理画面の表示がおかしくなっているという話が出てきた。 そこで調べてもらったところ、なぜかリリースしたはずの機能が正常に機能していない、という連絡を受けた。 また、影響範囲としてはデータの欠損が発生しているようだということも分かった。

progret.hatenadiary.com

検索方法が悪かったのか不具合についての記事は意外と出てこなったのですが、これは恐怖ですね。。

latestタグとは何でしょうか?

latestタグはその名の通り、latestというただのタグです。
latestイメージというのはlatestタグが付いたイメージのことです。
タグはイメージに紐付けられますが、イメージの管理者がタグの付け替えを行うことができます。
以前はバージョン6.xのイメージにlatestタグが紐付けられていたが、アップデートで8.xにlatestタグが付け替えられ、それを知らずにpullしてバージョン違いのイメージでコンテナを起動してしまうと、上記のような不具合につながる可能性がある、だからlatestタグ運用は危険ということだと思います。

また、AWSのECRではlatestタグを使用できないようにする設定もあるようです。

dev.classmethod.jp

コンテナ化したアプリケーションを管理するKubernetesの公式ドキュメントにも注意書きがあります。

Note: You should avoid using the :latest tag when deploying containers in production as it is harder to track which version of the image is running and more difficult to roll back properly.

kubernetes.io

イメージのバージョン追跡が困難になり、ロールバックができなくなるので、本番環境ではlatestタグの使用を避けるべきとのことです。

Dockerイメージのバージョンはどのように指定しますか?

When pulling an image by digest, you specify exactly which version of an image to pull. Doing so, allows you to “pin” an image to that version, and guarantee that the image you’re using is always the same.

docker pull | Docker Documentation

Docker公式によるとdigest(タグ)でプルするイメージのバージョンを正確に指定することで、そのバージョンにイメージを「固定」し、使用しているイメージが常に同じであることを保証できるようになるそうです。
Docker HUBのページでPostgreSQLのタグを確認してましょう。

dockerhub postgres

現在、latestタグはバージョン12.4に紐付いているようです。
実際にpullされたPostgreSQLのバージョンをローカルでも確認しましたが、12.4でした。

root@6007495537a6:/# psql --version
psql (PostgreSQL) 12.4 (Debian 12.4-1.pgdg100+1)

docker-compose.ymlのイメージ定義部分を変更します。
[update]PostgreSQL version to fix · heavy-stone/rails6-docker@e420242 · GitHub

image: postgres
↓
image: postgres:12.4

Dockerのlatestタグが付いたイメージを削除し、docker-compose upを実行すると、12.4のPostgreSQLイメージをpullしてくれました。

$ docker-compose up
Creating network "rails6-docker_default" with the default driver
Pulling db (postgres:12.4)...
12.4: Pulling from library/postgres
...

http://localhost:3000/ にブラウザでアクセスし、Rails6のページも確認できました。
これでPostgreSQLのバージョン指定が完了しました。

まとめ

Dockerイメージのバージョン指定の必要性について調査しました。
PostgreSQLのイメージバージョンを固定しました。
実はバージョン指定できていなのがもう一つあるので、今度はNode.jsのバージョン指定をしていきたいと思っています。

参考

vsupalov.com

github.com