初速1PV

プログラミングにまつわることの記録

docker-composeでserviceの更新にハマった話

docker-composeでmysqlのコンテナの起動時にオプションを付加しようとしてハマったときのメモです。

docker, docker-composeのバ一ジョンは以下です。

$ docker --version
Docker version 18.09.2, build 6247962
$ docker-compose --version
docker-compose version 1.23.2, build unknown

問題

dockerでmysqlを動かしていてdocker-composeからも動かせるようにしたいと思いいろいろしていました。 最近のmysqlではデフォルトの認証方式が変わったらしく オプションを渡してあげなくてはいけません。これから書く問題は最初にmysqlにオプションを渡し忘れて、そこからオプションを付加して更新しようとした話です。

以下のようなdocker-compose.ymlを書いていて,

version: '3'
services:
    mysql:
        image: "mysql/mysql-server"
        environment:
            - MYSQL_ROOT_HOST=%
            - MYSQL_ROOT_PASSWORD=password 
        ports:
            - "3306:3306"

docker-compose upをした後に<Ctrl-C>で終了、エディタでcommand: ...を付け足してもう一度docker-compose... ということをしていました。

version: '3'
services:
    mysql:
        image: "mysql/mysql-server"
        command: --default-authentication-plugin=mysql_native_password
        environment:
            - MYSQL_ROOT_HOST=%
            - MYSQL_ROOT_PASSWORD=password 
        ports:
            - "3306:3306"

本来はこれでmysqlのデフォルトの認証方式が変わってくれるはずですが変わらなかったという問題です。

原因

原因は<Ctrl-C>を押してもコンテナは破棄されずに停止したままだった。ということです。 なので

How to get docker-compose to always re-create containers from fresh images? - Stack Overflow に書いてあるようにコンテナを破壊してから再び実行するとserviceがうまく更新されました。

docker-compose rm -f
docker-compose up

さいごに

dockerコンテナが破棄されずに残っていたという残念なオチです。 解決した後に気付いたことですが、docker-compose up<Ctrl-C>を押すと出力の最後にもStopping .... doneとか出ていました。なので今後はもうすこしコマンドの出力を読むべきだなと思いました。

参考