hack のためのネタ帳, etc,,,

まとめ

Python 3.12 で distutils モジュールが廃止された影響で、
Ubuntu 24.04 LTS では docker-compose パッケージで提供されてる docker-compose コマンド(旧式の docker compose)が動かない。
代わりに、docker-compose-v2 パッケージで提供されてる docker compose サブコマンド(新式の docker compose)を使う必要がある。

状況

Ubuntu 22.04 LTS から do-release-upgrade された Ubuntu 24.04 LTS の環境で、
docker-compose を用いてコンテナを終了しようとしたら以下のようなエラーが出て、docker-compose コマンドその物が機能しなかった。
$ sudo docker-compose down
Traceback (most recent call last):
  File "/usr/bin/docker-compose", line 33, in <module>
    sys.exit(load_entry_point('docker-compose==1.29.2', 'console_scripts', 'docker-compose')())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/bin/docker-compose", line 25, in importlib_load_entry_point
    return next(matches).load()
           ^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/importlib/metadata/__init__.py", line 205, in load
    module = import_module(match.group('module'))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/importlib/__init__.py", line 90, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<frozen importlib._bootstrap>", line 1387, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1331, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 935, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 995, in exec_module
  File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
  File "/usr/lib/python3/dist-packages/compose/cli/main.py", line 9, in <module>
    from distutils.spawn import find_executable
ModuleNotFoundError: No module named 'distutils'

原因は、最後の1行に尽きるんだが、distutils モジュールがないぞと。

Microsoft Copilot 先生の回答は以下。
根本的な原因としては、Python 3.12以降で distutils モジュールが廃止されたせいで、Python - japanize-matplotlib が使えなくなった例の問題のようだ。

Copilot 先生の提案 1 は、setuptools 入れてみろと言ってるのだが、それはソース変更する必要あるのでは?
実際、matplotlib-font-ja で対応した際の変更は以下のような感じだし。
提案 2 は最近は docker コマンドに compose サブコマンドが追加されてるからそっちを使ってみろと。
確認してみたのだが、残念なことに
$ sudo docker compose down
docker: 'compose' is not a docker command.
See 'docker --help'
ってな感じで、この時点のうちの環境では docker compose サブコマンドは使えない状況だった。

インストール済みの docker 関連のパッケージ確認してみると以下の通り
$ dpkg -l | grep docker
ii  docker-compose                                1.29.2-6ubuntu1                          all          define and run multi-container Docker applications with YAML
ii  docker.io                                     24.0.7-0ubuntu4.1                        amd64        Linux container runtime
ii  python3-compose                               1.29.2-6ubuntu1                          all          Python implementation of docker-compose file specification
ii  python3-docker                                5.0.3-1ubuntu1                           all          Python 3 wrapper to access docker.io's control socket
ii  python3-dockerpty                             0.4.1-5                                  all          Pseudo-tty handler for docker Python client (Python 3.x)

一応、定期的に自動更新かかってるので dist-upgrade しても状況は変わらない感じ。

未インストールのパッケージ探してみたところ以下の v2 ってのがどうもそれっぽい感じだった。
$ apt-cache search docker|grep -i compose
docker-compose - define and run multi-container Docker applications with YAML
docker-compose-v2 - tool for running multi-container applications on Docker
podman-compose - Run docker-compose.yml using podman
python3-compose - Python implementation of docker-compose file specification

v2 と無印の説明比較
$ apt-cache show docker-compose-v2
Package: docker-compose-v2
Architecture: amd64
Version: 2.24.6+ds1-0ubuntu2
Built-Using: glibc (= 2.39-0ubuntu8)
Priority: optional
Section: universe/admin
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 52954
Depends: docker.io, libc6 (>= 2.34)
Filename: pool/universe/d/docker-compose-v2/docker-compose-v2_2.24.6+ds1-0ubuntu2_amd64.deb
Size: 12706616
MD5sum: 747cd9fa40eb5853b4c268af6b0dad14
SHA1: e6da5f0394fe293c0aae57bf6d9f9609da66f7db
SHA256: db03a75e26c64e45e8febfd8bff877f9a1c405a0888cde7bebdb17368c6a9908
SHA512: a98a182fa76bed4a0701960b84c29fcc08d0ea584fb6b2aa2fae89919715722165777b90b10989f967b7649fa391d29a00856110f3a6b959e803e03f8a2adad7
Homepage: https://github.com/docker/compose
Description-en: tool for running multi-container applications on Docker
 Docker Compose is a tool for running multi-container applications on Docker
 defined using the Compose file format. A Compose file is used to define how one
 or more containers that make up your application are configured. Once you have
 a Compose file, you can create and start your application with a single
 command: docker compose up.
Description-md5: 5154254fe821768bcad19fcde6623d41
$ apt-cache show docker-compose
Package: docker-compose
Architecture: all
Version: 1.29.2-6ubuntu1
Priority: optional
Section: universe/admin
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Docker Compose Team <team+docker-compose@tracker.debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 60
Depends: python3:any, python3-compose (= 1.29.2-6ubuntu1)
Recommends: docker.io (>= 1.9.0)
Filename: pool/universe/d/docker-compose/docker-compose_1.29.2-6ubuntu1_all.deb
Size: 14046
MD5sum: a8534f002c3f3037f1680013c6eb8f47
SHA1: e15abad99c2e75ab2d2debbd89789c2247ac97ec
SHA256: df99bd4ab4e76ddc4bc6e593b561b5d9a82a2b98bc82a8640c261ef1cd70a47a
SHA512: 51e9437c9bc334f6794f3648efa56d3e6adae4f363066362c5775272a83abd72c0db302255e7fad2b0ec9380a6c5d35019ebeb3b15901d014a5f22390d51b9c6
Homepage: https://docs.docker.com/compose/
Description-ja: define and run multi-container Docker applications with YAML
 docker-compose is a service management software built on top of docker.
 Define your services and their relationships in a simple YAML file, and
 let compose handle the rest.
 .
 本パッケージはコマンドラインツールを含んでいます。
Description-md5: 0bd446176134933063c836709eac63b0

と言う事で、試しに
sudo apt install docker-compose-v2
してみたところ、無事、docker compose サブコマンドが利用可能になり、コンテナを終了させることが出来た。

とりあえず、
sudo apt purge --autoremove docker-compose
してみると、
$ dpkg -l | grep docker
ii  docker-compose-v2                             2.24.6+ds1-0ubuntu2                      amd64        tool for running multi-container applications on Docker
ii  docker.io                                     24.0.7-0ubuntu4.1                        amd64        Linux container runtime
の2パッケージだけになったのだが、
$ apt-cache search docker | grep compose
docker-compose - define and run multi-container Docker applications with YAML
docker-compose-v2 - tool for running multi-container applications on Docker
podman-compose - Run docker-compose.yml using podman
python3-compose - Python implementation of docker-compose file specification
みたいな感じで、リポジトリには動かない無印(v1)が残っている状況なので、地味に罠っぽい。

なお、提案 1 の setuptools については、入れておけば、distutils を import 出来るみたいな情報が以下のポストに見られる。
確かに、distutils がないって言われなくはなるんだけど、少なくとも Ubuntu 24.04 LTS で python3-setuptools と docker-compose の組み合わせだと、以下のような感じで別の問題が発生して結局エラーで止まるという結果だった。
$ sudo docker-compose down
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/docker/api/client.py", line 214, in _retrieve_server_version
    return self.version(api_version=False)["ApiVersion"]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/docker/api/daemon.py", line 181, in version
    return self._result(self._get(url), json=True)
                        ^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/docker/utils/decorators.py", line 46, in inner
    return f(self, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/docker/api/client.py", line 237, in _get
    return self.get(url, **self._set_request_timeout(kwargs))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/requests/sessions.py", line 602, in get
    return self.request("GET", url, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/requests/sessions.py", line 589, in request
    resp = self.send(prep, **send_kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/requests/sessions.py", line 703, in send
    r = adapter.send(request, **kwargs)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/requests/adapters.py", line 486, in send
    resp = conn.urlopen(
           ^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 791, in urlopen
    response = self._make_request(
               ^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 497, in _make_request
    conn.request(
TypeError: HTTPConnection.request() got an unexpected keyword argument 'chunked'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/bin/docker-compose", line 33, in <module>
    sys.exit(load_entry_point('docker-compose==1.29.2', 'console_scripts', 'docker-compose')())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/compose/cli/main.py", line 81, in main
    command_func()
  File "/usr/lib/python3/dist-packages/compose/cli/main.py", line 200, in perform_command
    project = project_from_options('.', options)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/compose/cli/command.py", line 60, in project_from_options
    return get_project(
           ^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/compose/cli/command.py", line 152, in get_project
    client = get_client(
             ^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/compose/cli/docker_client.py", line 41, in get_client
    client = docker_client(
             ^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/compose/cli/docker_client.py", line 170, in docker_client
    client = APIClient(use_ssh_client=not use_paramiko_ssh, **kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/docker/api/client.py", line 197, in __init__
    self._version = self._retrieve_server_version()
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/docker/api/client.py", line 221, in _retrieve_server_version
    raise DockerException(
docker.errors.DockerException: Error while fetching server API version: HTTPConnection.request() got an unexpected keyword argument 'chunked'

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

管理人/副管理人のみ編集できます