Python 3.12 で distutils モジュールが廃止された影響で、
Ubuntu 24.04 LTS では docker-compose パッケージで提供されてる docker-compose コマンド(旧式の docker compose)が動かない。
代わりに、docker-compose-v2 パッケージで提供されてる docker compose サブコマンド(新式の docker compose)を使う必要がある。
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 コマンドその物が機能しなかった。
原因は、最後の1行に尽きるんだが、distutils モジュールがないぞと。
Microsoft Copilot 先生の回答は以下。
根本的な原因としては、Python 3.12以降で distutils モジュールが廃止されたせいで、Python - japanize-matplotlib が使えなくなった例の問題のようだ。
Copilot 先生の提案 1 は、setuptools 入れてみろと言ってるのだが、それはソース変更する必要あるのでは?
実際、matplotlib-font-ja で対応した際の変更は以下のような感じだし。
提案 2 は最近は docker コマンドに compose サブコマンドが追加されてるからそっちを使ってみろと。
確認してみたのだが、残念なことに
インストール済みの docker 関連のパッケージ確認してみると以下の通り
一応、定期的に自動更新かかってるので dist-upgrade しても状況は変わらない感じ。
未インストールのパッケージ探してみたところ以下の v2 ってのがどうもそれっぽい感じだった。
v2 と無印の説明比較
と言う事で、試しに
とりあえず、
なお、提案 1 の setuptools については、入れておけば、distutils を import 出来るみたいな情報が以下のポストに見られる。
確かに、distutils がないって言われなくはなるんだけど、少なくとも Ubuntu 24.04 LTS で python3-setuptools と docker-compose の組み合わせだと、以下のような感じで別の問題が発生して結局エラーで止まるという結果だった。
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 で対応した際の変更は以下のような感じだし。
- GitHub / ciffelia / matplotlib-fontja / commit / 2024-01-03: [1047c04] Python 3.12で削除されたdistutilsを使わないよう修正
提案 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 出来るみたいな情報が以下のポストに見られる。
- Qiita / pitao / 2023-12-19: 【inshellisense】ModuleNotFoundError: No module named 'distutils' の対処法
確かに、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'
タグ
コメントをかく