🙆
[Python] Dockerでmysqlclientをインストールしようとしたらエラーになった
[状況] Pythonコンテナ内でmysqlclientライブラリをインストールできない
DockerでDjangoの環境を整えてたんですが、デフォルトのDBがsqlite3なのでMySQLに変えたいなと思いmysqlclientを入れることしました。
そしたらエラーが。。。
環境
- Docker Image: python:3.9-slim-buster
- docker-composeで使用しました
- Poetryでパッケージ管理, 仮想環境の作成はしない
エラー内容
pip installの時に出たエラー
WARNING: Discarding https://files.pythonhosted.org/packages/6b/ba/4729d99e85a0a35bb46d55500570de05b4af10431cef174b6da9f58a0e50/mysqlclient-1.3.1.tar.gz#sha256=3549e8a61f10c8cd8eac6581d3f44d0594f535fb7b29e6090db3a0bc547b25ad (from https://pypi.org/simple/mysqlclient/). Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
Downloading mysqlclient-1.3.0.tar.gz (76 kB)
|████████████████████████████████| 76 kB 2.6 MB/s
ERROR: Command errored out with exit status 1:
command: /usr/local/bin/python -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-qxc2dmju/mysqlclient_4c9f9e4a8c36490eb974ff335108b74b/setup.py'"'"'; __file__='"'"'/tmp/pip-install-qxc2dmju/mysqlclient_4c9f9e4a8c36490eb974ff335108b74b/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pip-pip-egg-info-2x9fv3sm
cwd: /tmp/pip-install-qxc2dmju/mysqlclient_4c9f9e4a8c36490eb974ff335108b74b/
Complete output (10 lines):
/bin/sh: 1: mysql_config: not found
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/tmp/pip-install-qxc2dmju/mysqlclient_4c9f9e4a8c36490eb974ff335108b74b/setup.py", line 17, in <module>
metadata, options = get_config()
File "/tmp/pip-install-qxc2dmju/mysqlclient_4c9f9e4a8c36490eb974ff335108b74b/setup_posix.py", line 47, in get_config
libs = mysql_config("libs_r")
File "/tmp/pip-install-qxc2dmju/mysqlclient_4c9f9e4a8c36490eb974ff335108b74b/setup_posix.py", line 29, in mysql_config
raise EnvironmentError("%s not found" % (mysql_config.path,))
OSError: mysql_config not found
----------------------------------------
WARNING: Discarding https://files.pythonhosted.org/packages/6a/91/bdfe808fb5dc99a5f65833b370818161b77ef6d1e19b488e4c146ab615aa/mysqlclient-1.3.0.tar.gz#sha256=06eb5664e3738b283ea2262ee60ed83192e898f019cc7ff251f4d05a564ab3b7 (from https://pypi.org/simple/mysqlclient/). Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
ERROR: Could not find a version that satisfies the requirement mysqlclient
ERROR: No matching distribution found for mysqlclient
poetry add mysqlclientを実行した場合
root@ab7539c2e4b3:/app# poetry add mysqlclient
Skipping virtualenv creation, as specified in config file.
Using version ^2.0.3 for mysqlclient
Updating dependencies
Resolving dependencies... (0.1s)
Package operations: 1 install, 0 updates, 0 removals
• Installing mysqlclient (2.0.3): Failed
EnvCommandError
Command ['/usr/local/bin/python', '-m', 'pip', 'install', '--no-deps', 'file:///root/.cache/pypoetry/artifacts/05/ad/42/dc7ff8275bac1e980504b1329276be3cbf3479af84b845824ec830d25d/mysqlclient-2.0.3.tar.gz'] errored with the following return code 1, and output:
Processing /root/.cache/pypoetry/artifacts/05/ad/42/dc7ff8275bac1e980504b1329276be3cbf3479af84b845824ec830d25d/mysqlclient-2.0.3.tar.gz
ERROR: Command errored out with exit status 1:
command: /usr/local/bin/python -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-req-build-tscjkt1q/setup.py'"'"'; __file__='"'"'/tmp/pip-req-build-tscjkt1q/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pip-pip-egg-info-gcb9qr0j
cwd: /tmp/pip-req-build-tscjkt1q/
Complete output (15 lines):
/bin/sh: 1: mysql_config: not found
/bin/sh: 1: mariadb_config: not found
/bin/sh: 1: mysql_config: not found
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/tmp/pip-req-build-tscjkt1q/setup.py", line 15, in <module>
metadata, options = get_config()
File "/tmp/pip-req-build-tscjkt1q/setup_posix.py", line 70, in get_config
libs = mysql_config("libs")
File "/tmp/pip-req-build-tscjkt1q/setup_posix.py", line 31, in mysql_config
raise OSError("{} not found".format(_mysql_config_path))
OSError: mysql_config not found
mysql_config --version
mariadb_config --version
mysql_config --libs
----------------------------------------
WARNING: Discarding file:///root/.cache/pypoetry/artifacts/05/ad/42/dc7ff8275bac1e980504b1329276be3cbf3479af84b845824ec830d25d/mysqlclient-2.0.3.tar.gz. Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
at /usr/local/lib/python3.9/site-packages/poetry/utils/env.py:1074 in _run
1070│ output = subprocess.check_output(
1071│ cmd, stderr=subprocess.STDOUT, **kwargs
1072│ )
1073│ except CalledProcessError as e:
→ 1074│ raise EnvCommandError(e, input=input_)
1075│
1076│ return decode(output)
1077│
1078│ def execute(self, bin, *args, **kwargs):
Failed to add packages, reverting the pyproject.toml file to its original content.
[原因&解決] いろいろインストールしなければいけないらしい
いろいろ調べてみた結果何かしらインストールしなければいけないらしいです。ただ自分の環境では一発で解決しませんでした。
Dockerfileに書き加える
私の場合、紆余曲折あってgccとlibmariadb-devをインストールしたらいけたので以下のようにDockerfileに書き加えます。
FROM python:3.9-slim-buster
RUN apt-get update && \
apt-get -y install gcc libmariadb-dev
再ビルドする
再ビルドしたらmysqlclientがインストールできるようになっていると思います。
おまけ
解決に至った経緯
- libmysqlclient-dev
- これを入れようとしたら、libmariadb-devを進めれた
- その後pip install mysqlclientを実行したら、「error: command ‘gcc’ failed: No such file or directory」という文言を見つけた
- gcc
- 上記を理由にインストールしてみた。
解決した!
いろいろ試したライブラリ(今回は関係なさそう?)
試す過程でいろいろとインストールしたけどこれらは関係なさそう?
- python3-dev
- libssl-dev
- default-mysql-client
Discussion