Check! docker-compose で urllib3 が原因でエラーになる場合の対処

こんばんは、 @dz_ こと大平かづみです。

Prologue - はじめに

vagrant の ubuntu/trusty64 をアップデートしたら、vagrant 内で使っている docker-compose が動かなくなってしまったので対応しました。その備忘録です。

エラー内容

docker-compose を利用しようとすると、以下のように python のエラーが発生しました。

エラーの抜粋

vagrant@vagrant-ubuntu-trusty-64:~$ docker-compose --help

  ... <略> ...

  File "/usr/local/lib/python2.7/dist-packages/docker/transport/ssladapter.py", line 22, in <module>
    urllib3.connection.match_hostname = match_hostname
AttributeError: 'module' object has no attribute 'connection'

発生環境

  • vagrant box: 'ubuntu/trusty64' (v20170131.0.0) (Ubuntu 14.04.5 LTS)
# python の docker 関連のバージョンを確認する
vagrant@vagrant-ubuntu-trusty-64:~$ pip freeze | grep docker
docker==2.0.2
docker-compose==1.10.1
docker-pycreds==0.2.1
dockerpty==0.4.1

# Docker のバージョンを確認する
vagrant@vagrant-ubuntu-trusty-64:~$ docker version
Client:
 Version:      1.13.0
 API version:  1.25
 Go version:   go1.7.3
 Git commit:   49bf474
 Built:        Tue Jan 17 09:50:17 2017
 OS/Arch:      linux/amd64

Server:
 Version:      1.13.0
 API version:  1.25 (minimum version 1.12)
 Go version:   go1.7.3
 Git commit:   49bf474
 Built:        Tue Jan 17 09:50:17 2017
 OS/Arch:      linux/amd64
 Experimental: false

調査

こちらの記事を参照すると、どうやら python の urllib3 のバージョンが合わないようです。 urllib3 の最新バージョンは 1.20 なのに、なぜか 1.7.1 が入っていました。

更に調べると、こちらの issue でも指摘されているように、 apt-get でインストールされる python-urllib3 が 1.7.1 なのでした。

# python の urllib3 のバージョンを確認する
vagrant@vagrant-ubuntu-trusty-64:~$ pip freeze | grep urllib3
urllib3==1.7.1

# apt-get でインストールされた python-urllib3 のバージョンを確認する
vagrant@vagrant-ubuntu-trusty-64:~$ dpkg --list | grep urllib3
ii  python-urllib3                       1.7.1-1ubuntu4                      all          HTTP library with thread-safe connection pooling for Python
ii  python-urllib3-whl                   1.7.1-1ubuntu4                      all          HTTP library with thread-safe connection pooling

だがしかし…

単純に pip install urllib3=1.20 でインストールしても、 docker は 1.7.1 の方を見てしまい、うまく行きませんでした。 そこで、 apt-get remove python-urllib3 python-urllib3-whl で取り除くとたしかに docker は動くのですが、今度は pip も一緒にアンイストールされてしまい…、これではだめですね(´・ω・`)

結論

私はこのとき、vagrant 内で docker-compose を使いたいのでした。これを達成するには、方法は2つありそうです。

ひとつは、 apt-getpython-urllib3* は削除し、 pipapt-get を使わず get-pip.py でインストールする方法でしょう。

そして、もうひとつは、Ubuntu のバージョンを上げてしまうことでした。

なぜかというと、 ubuntu/trusty (14.04) でインストールされる python-urllib31.7.1-1build1 だそうだが、 ubuntu/xenial (16.04) でインストールされる python-urllib31.13.1-2 なんだそうです。

ということで、 Ubuntu を 16.04 に更新することで事なきを得ました!!

(Ubuntu 16.04 でも urllib3 が最新バージョンではないですが、docker-compose の利用には問題ありませんでした。)

Epilogue - おわりに

発生環境が限られるエラーかもしれませんが、どなたかの参考になれば幸いです m(_ _)m

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.