くそメモです。
エラーが出た
docker用playbookでauto_removeを試してみようとしたところ、下記のエラーが出た。
"'auto_remove' is not compatible with docker-py, and requires the docker python module"
謎解き
上記でググってみると、ソースが発見できた。
---
if not HAS_DOCKER_PY_2 and client.module.params.get('auto_remove'):
client.module.fail_json(msg="'auto_remove' is not compatible with docker-py, and requires the docker python module")
---
HAS_DOCKER_PY_2とは何ぞや、ということでさらに調べると
try:
from requests.exceptions import SSLError
from docker import __version__ as docker_version
from docker.errors import APIError, TLSParameterError, NotFound
from docker.tls import TLSConfig
from docker.constants import DEFAULT_TIMEOUT_SECONDS, DEFAULT_DOCKER_API_VERSION
from docker import auth
if LooseVersion(docker_version) >= LooseVersion('2.0.0'):
HAS_DOCKER_PY_2 = True
なるほど、dockerのversionが古いから無理なのか…ってpipでインストールしてるはずなんですけど!!
# pip list 2>/dev/null | grep docker
docker (2.5.1)
docker-py (1.10.6)
docker-pycreds (0.2.1)
# python -c "from docker import __version__ as v;print v"
1.10.6
あ、docker-pyが入ってる…。これがいかんかった。
docker-pyは現在dockerに内包されるようになっている。
公式githubにも「pip install docker」って書いてある。
じゃあdocker-py消そうかな。
# pip uninstall docker-py
Uninstalling docker-py-1.10.6:
(略)
Proceed (y/n)? y
Successfully uninstalled docker-py-1.10.6
#
したっけ、これで2.5.1になって無事auto_remove使えるっしょ…バージョン確認しよう。
# python -c "from docker import __version__ as v;print v"
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: No module named docker
(||°ਊ°)え…
モジュール見つかんなくなっちゃったよ…。
ここでもう一度pip uninstallのログを見てみる。
Uninstalling docker-py-1.10.6:
/usr/lib/python2.7/site-packages/docker/__init__.py
そ こ 消 し と っ た ん か い ! ! !
どうやら、docker-pyを間違って入れてしまって、消すと、docker側の__init__.pyが巻き添えを食ってお亡くなりになり、
パスが通らなくなってしまうようです。ははは。
ということで、docker入れなおします。
# pip uninstall docker
(略)
# pip install docker
(略)
# python -c "from docker import __version__ as v;print v"
2.5.1
めでたし。
(auto_removeもチリバツで効いた)
教訓
- 昔の記事を鵜呑みにしてpip install docker-pyしない
- もしinstallしちゃったらdockerもpip installし直せ
- うそはうそであると見抜ける人でないとQiitaを使うのは難しい