Docker でpython-slimにmysqlclient をインストールする方法

Dockerを使用する際、しばしば直面するのが依存関係の問題です。特にPythonのスリムイメージでは、サイズ削減のために多くのパッケージが省かれているため、これが予期せぬエラーを引き起こすことがあります。

今回は、そんな状況下での一つの典型的な例、「mysqlclientのインストール」に焦点を当てます。

このブログでは、エラーの内容から解決策、その解説を行います。

Dockerを使ってPythonアプリケーションを構築する際に遭遇するこの種の問題を解決しましょう!

エラーの内容

Dockerの python:3.11-slim-bookworm イメージを使用している際に、mysqlclient==2.2.0 のインストールで問題が発生しました。

2.834 Collecting mysqlclient (from -r requirements.txt (line 6))
2.857   Downloading mysqlclient-2.2.0.tar.gz (89 kB)
2.862      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 89.5/89.5 kB 25.8 MB/s eta 0:00:00
2.870   Installing build dependencies: started
3.703   Installing build dependencies: finished with status 'done'
3.703   Getting requirements to build wheel: started
3.777   Getting requirements to build wheel: finished with status 'error'
3.780   error: subprocess-exited-with-error
3.780   
3.780   × Getting requirements to build wheel did not run successfully.
3.780   │ exit code: 1
3.780   ╰─> [27 lines of output]
3.780       /bin/sh: 1: pkg-config: not found
3.780       /bin/sh: 1: pkg-config: not found
3.780       Trying pkg-config --exists mysqlclient
3.780       Command 'pkg-config --exists mysqlclient' returned non-zero exit status 127.
3.780       Trying pkg-config --exists mariadb
3.780       Command 'pkg-config --exists mariadb' returned non-zero exit status 127.
3.780       Traceback (most recent call last):
3.780         File "/usr/local/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 353, in <module>
3.780           main()
3.780         File "/usr/local/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 335, in main
3.780           json_out['return_val'] = hook(**hook_input['kwargs'])
3.780                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
3.780         File "/usr/local/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 118, in get_requires_for_build_wheel
3.780           return hook(config_settings)
3.780                  ^^^^^^^^^^^^^^^^^^^^^
3.780         File "/tmp/pip-build-env-zxq9qe7f/overlay/lib/python3.11/site-packages/setuptools/build_meta.py", line 325, in get_requires_for_build_wheel
3.780           return self._get_build_requires(config_settings, requirements=['wheel'])
3.780                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
3.780         File "/tmp/pip-build-env-zxq9qe7f/overlay/lib/python3.11/site-packages/setuptools/build_meta.py", line 295, in _get_build_requires
3.780           self.run_setup()
3.780         File "/tmp/pip-build-env-zxq9qe7f/overlay/lib/python3.11/site-packages/setuptools/build_meta.py", line 311, in run_setup
3.780           exec(code, locals())
3.780         File "<string>", line 154, in <module>
3.780         File "<string>", line 48, in get_config_posix
3.780         File "<string>", line 27, in find_package_name
3.780       Exception: Can not find valid pkg-config name.
3.780       Specify MYSQLCLIENT_CFLAGS and MYSQLCLIENT_LDFLAGS env vars manually
3.780       [end of output]
3.780   
3.780   note: This error originates from a subprocess, and is likely not a problem with pip.
3.781 error: subprocess-exited-with-error
3.781 
3.781 × Getting requirements to build wheel did not run successfully.
3.781 │ exit code: 1
3.781 ╰─> See above for output.
3.781 
3.781 note: This error originates from a subprocess, and is likely not a problem with pip.
------
failed to solve: process "/bin/sh -c pip install --upgrade pip &&     pip install -r requirements.txt" did not complete successfully: exit code: 1

エラーメッセージは、pkg-config が見つからないこと、およびMySQLの開発ライブラリが不足していることです。

これは、Pythonのスリムイメージにはこれらの依存関係が含まれていないためです。

mysqlclientを最小限の構成でインストール

急いでいる方のためにまずは解決方法を示します。

FROM python:3.11-slim-bookworm

# mysqlclientに必要な依存関係をインストール
RUN apt-get update && \
    apt-get install -y default-libmysqlclient-dev build-essential pkg-config

# mysqlclientをインストール
RUN pip install mysqlclient==2.2.0

上記の設定で最小限の構成でmysqlclientをインストールできます。

もう少し詳しく原因を知りたい人は続きをご参考ください。

各設定内容の解説

  1. 必要な依存関係をインストールするために、Dockerfileに apt-get updateapt-get install コマンドを追加しました。

  2. default-libmysqlclient-devbuild-essentialpkg-config といったパッケージをインストールしました。これにより、mysqlclient のビルドに必要な依存関係を追加しました。

  3. 最後に、pip install mysqlclient==2.2.0 コマンドでmysqlclient をインストールしています。

まとめ

Dockerの python:3.11-slim-bookworm イメージを使用する際に mysqlclient をインストールするためには、特定のシステム依存関係をインストールする必要があります。

これには、apt-get コマンドを使用して必要なパッケージをインストールし、その後に pip コマンドで mysqlclient をインストールします。

これで、スムーズに mysqlclient のインストールできます。

この記事があなたのお役に立てれば幸いです。それでは楽しいPython開発ライフを(^^)v

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください