🙆

[Python] Dockerでmysqlclientをインストールしようとしたらエラーになった

2021/05/03に公開

[状況] 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.

[原因&解決] いろいろインストールしなければいけないらしい

https://qiita.com/henrich/items/1b7ee2f3a72f8bb29cba

https://stackoverflow.com/questions/58110882/run-python-mysql-client-on-slim-python-3-6-docker-image

いろいろ調べてみた結果何かしらインストールしなければいけないらしいです。ただ自分の環境では一発で解決しませんでした。

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