container-up というツールを書いたのでご紹介。

背景

このブログはghost というブログエンジンで動いています。動作環境としてDocker を使用していて、Ghostの公式イメージ を使用しています。 過去の経緯から、単体のDockerコンテナで動作させており、永続データはDockerボリュームとしてマウントしている形です。

扨、Docker ComposeやKubernetesなどのオーケストレーションツールを使っている場合、コンテナのバージョンアップは比較的簡単に行うことができます。 たとえば、Docker Composeを使用している場合、docker-compose upで、新しいイメージで作成したコンテナに差し替えることができます。

しかし、Dockerを単体で使っている場合、基本的には手作業で差し替えを行う必要があります。 Ghostコンテナの更新時は手作業でBlue-Greenアップグレードを行ってきたのですが、Ghostはかなりアップデートのペースが速く、毎度コンテナを差し替えるのが面倒になってきました。 それを楽にするため、container-upを作りました。

インストール

Go環境がある人

Go言語の環境がすでにある人は、以下のコマンドで使用できるようになります。

$ go get github.com/nasa9084/container-up

それ以外の人

Go言語の環境がない人は、Releases ページから自分のOSに併せてバイナリをダウンロード、パスを通してください。 windows, linux, macos向け、それぞれamd64版のバイナリを用意してあります。 動作確認はmacos、linux(CentOS 7)のみ行っています。

これら以外の環境の人は、予めdep をインストールした上で以下のコマンドでコンパイルしてください。

$ git clonse https://github.com/nasa9084/container-up.git
$ cd container-up
$ dep ensure
$ go build -o container-up main.go

コンパイルしたら、任意の場所にバイナリを移動し、パスを通してください。

使い方

基本的な使い方は、引数にコンテナ名またはコンテナIDを渡すだけです。

$ container-up CONTAINER_NAME

与えられたコンテナと同じ名称のイメージを使用して、ボリュームやネットワークなどの設定はそのままに新しいコンテナを作成し、差し替えます。 :latestなイメージを使用している場合、docker pullした後にこのコマンドを実行することで、最新のイメージから作られたコンテナに差し替わるということです。

もとのコンテナは--rmオプションをつけて起動していた場合を除いて、_oldContainerというサフィックスが付いた状態でstopします。 なにか問題があった場合は、このコンテナに戻すと良いでしょう。

もし、元のコンテナが必要ない場合は、--rmオプションをつけると、差し替え時に削除します。

$ container-up --rm CONTAINER_NAME

:latestではないような、バージョンタグが付いたイメージを使用していて、新しいバージョンのイメージを使いたい場合などのため、新しいイメージ名を指定して実行することもできます。

$ container-up -i IMAGE_NAME CONTAINER_NAME

この場合、差し替えるコンテナは指定されたイメージで作成されます。

これらのコマンドでは、ボリュームのマウント設定は引き継ぎますが、それ以外のファイルはすべて新しいイメージに差し替わります。 もし、ボリュームマウントしているところ以外に引き継ぎたいファイルなどがある場合1-fオプションにファイルパスを指定することで新しいコンテナにコピーすることができます。

$ container-up -f /path/to/file.ex CONTAINER_NAME

-fオプションは複数指定することができますので、複数のファイルをコピーしたい場合には複数回指定してください。

$ container-up -f /path/to/file1 -f /path/to/file2 CONTAINER_NAME

現状実装されている機能は以上です。 ヘルプは-hオプションをつけることで見られます。


  1. たとえば設定ファイルなど ↩︎