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
をインストールできます。
もう少し詳しく原因を知りたい人は続きをご参考ください。
各設定内容の解説
- 必要な依存関係をインストールするために、Dockerfileに
apt-get update
とapt-get install
コマンドを追加しました。 -
default-libmysqlclient-dev
、build-essential
、pkg-config
といったパッケージをインストールしました。これにより、mysqlclient
のビルドに必要な依存関係を追加しました。 -
最後に、
pip install mysqlclient==2.2.0
コマンドでmysqlclient
をインストールしています。
まとめ
Dockerの python:3.11-slim-bookworm
イメージを使用する際に mysqlclient
をインストールするためには、特定のシステム依存関係をインストールする必要があります。
これには、apt-get
コマンドを使用して必要なパッケージをインストールし、その後に pip
コマンドで mysqlclient
をインストールします。
これで、スムーズに mysqlclient
のインストールできます。
この記事があなたのお役に立てれば幸いです。それでは楽しいPython開発ライフを(^^)v
コメントを残す