Help us understand the problem. What is going on with this article?

ansibleでdockerをいじろうとしてハマった

More than 3 years have passed since last update.

くそメモです。

エラーが出た

docker用playbookでauto_removeを試してみようとしたところ、下記のエラーが出た。

"'auto_remove' is not compatible with docker-py, and requires the docker python module"

謎解き

上記でググってみると、ソースが発見できた。

docker_container.py
---
    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とは何ぞや、ということでさらに調べると

docker_common.py
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を使うのは難しい
hasegit
ゲーム開発に憧れて、プログラミングをしたくてこの業界に来たものの、何故かインフラをガッツリやらされて生きてきたおじさん。自動化至上主義。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away