docker-compose mysqlclient mit python:3.7-alpine - Fehler

Django, Flask, Bottle, WSGI, CGI…
Antworten
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Wenn ich

Code: Alles auswählen

docker-compose build
ausführe, dann renne ich einen merkwürdigen Fehler:

#10 3.312 Collecting mysqlclient==2.0.3
#10 3.336 Downloading mysqlclient-2.0.3.tar.gz (88 kB)
#10 3.372 Preparing metadata (setup.py): started
#10 3.793 ERROR: Command errored out with exit status 1:
#10 3.793 command: /usr/local/bin/python -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-5a63iik2/mysqlclient_248acd81fe88472583af648ffac84773/setup.py'"'"'; __file__='"'"'/tmp/pip-install-5a63iik2/mysqlclient_248acd81fe88472583af648ffac84773/setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(__file__) if os.path.exists(__file__) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pip-pip-egg-info-6378qd7a
#10 3.793 cwd: /tmp/pip-install-5a63iik2/mysqlclient_248acd81fe88472583af648ffac84773/
#10 3.793 Complete output (15 lines):
#10 3.793 mysql_config --version
#10 3.793 /bin/sh: mysql_config: not found
#10 3.793 mariadb_config --version
#10 3.793 /bin/sh: mariadb_config: not found
#10 3.793 mysql_config --libs
#10 3.793 /bin/sh: mysql_config: not found
#10 3.793 Traceback (most recent call last):
#10 3.793 File "<string>", line 1, in <module>
#10 3.793 File "/tmp/pip-install-5a63iik2/mysqlclient_248acd81fe88472583af648ffac84773/setup.py", line 15, in <module>
#10 3.793 metadata, options = get_config()
#10 3.793 File "/tmp/pip-install-5a63iik2/mysqlclient_248acd81fe88472583af648ffac84773/setup_posix.py", line 70, in get_config
#10 3.793 libs = mysql_config("libs")
#10 3.793 File "/tmp/pip-install-5a63iik2/mysqlclient_248acd81fe88472583af648ffac84773/setup_posix.py", line 31, in mysql_config
#10 3.793 raise OSError("{} not found".format(_mysql_config_path))
#10 3.793 OSError: mysql_config not found
#10 3.793 ----------------------------------------
#10 3.793 Preparing metadata (setup.py): finished with status 'error'
#10 3.793 WARNING: Discarding https://files.pythonhosted.org/packages ... 0f08a7c432 (from https://pypi.org/simple/mysqlclient/) (requires-python:>=3.5). Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
#10 3.795 ERROR: Could not find a version that satisfies the requirement mysqlclient==2.0.3 (from versions: 1.3.0, 1.3.1, 1.3.2, 1.3.3, 1.3.4, 1.3.5, 1.3.6, 1.3.7, 1.3.8, 1.3.9, 1.3.10, 1.3.11rc1, 1.3.11, 1.3.12, 1.3.13, 1.3.14, 1.4.0rc1, 1.4.0rc2, 1.4.0rc3, 1.4.0, 1.4.1, 1.4.2, 1.4.2.post1, 1.4.3, 1.4.4, 1.4.5, 1.4.6, 2.0.0, 2.0.1, 2.0.2, 2.0.3, 2.1.0rc1, 2.1.0)
#10 3.795 ERROR: No matching distribution found for mysqlclient==2.0.3
------
failed to solve: rpc error: code = Unknown desc = executor failed running [/bin/sh -c pip install -r requirements.txt]: exit code: 1

Ich verstehe nicht, wo das Problem liegt. Ich habe doch Python 3.7.0.

Das Image basiert auf Python:3.7-alpine.

In meinem Dockerfile sieht es so aus:

Code: Alles auswählen

(...)
# install dependencies
RUN pip install --upgrade pip
COPY ./requirements.txt .
RUN pip install -r requirements.txt
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das hat nichts mit der Python Version zu tun. Die passt doch. Zumindest bei mir ist 3.7 größer 3.5.

Aber das Kommando mysql_config fehlt eben. Ich vermute mal das steckt in einem MySQL dev Paket. Oder so.
einfachTobi
User
Beiträge: 492
Registriert: Mittwoch 13. November 2019, 08:38

Versuch mal, nur zum Test, ob es mit dem normalen Python Image funktioniert. Ich hatte auch mal das Problem, dass sich Drittbibliotheken partout nicht auf einem Alpine Image installieren lassen wollte. Mit etwas Arbeit hätte man es bestimmt anpassen können - ich bin dann einfach aufs normale Image gewechselt.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

@einfachTobi: teilweise kann das an MUSL liegen, der alternativen libc, die alpine verwendet. Aber hier fehlt erstmal nur eine Voraussetzung zum Bau. Sobald der Compiler anspringt, kann es aber natürlich wieder eng werden.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Python wheels unterstützen musl erst seit recht kurzer Zeit, so kurz dass es noch nichtmal richtig dokumentiert ist. Die Konsequenz ist dass in vielen Fällen bei der Installation Dinge kompiliert werden müssen. Ich würde deswegen bei Python Anwendungen von Alpine momentan abraten.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

@DasIch: warum ist das ein Problem, wenn die Kompilation durchgeht? Das Image ist dann doch gebaut. Den extra Zeitaufwand bemerkt der gelegentliche Nutzer doch nicht, oder? Man kann sonst ja auch die Images nochmal schneiden.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Erstmal ist es mit der Kompilierung gar nicht so einfach bei einigen Abhängigkeiten, gerade numpy oder auch bei einigen Sachen im ML Bereich ist es ein ziemlicher Akt dass zum laufen zu kriegen. Die Zeit die Kompilierung kostet merkt man auch durchaus wenn man CI/CD betreibt. Abgesehen davon nutzt man ja Alpine üblicherweise um ein kleines Image zu bekommen, wenn man aber die Toolchain zum kompilieren benötigt ist das Image dann alles andere als klein. Das kann man über multistage Builds zwar lösen, führt aber auch wieder zu mehr Komplexität.

Letztendlich muss man sich da dann die Frage stellen ob sich dies alles lohnt, ich denke dass dies nicht der Fall ist.
Antworten