I’m new to docker and deployment using docker with dockerfile and docker-composefiles.
Iam using flask and MySQL for this module.
while trying to build a web image using docker it fails. I don’t know what’s the issue,
Any help would be appreciated
Docker-compose
version: "3.9"
x-user-module: &app-container
build:
context: "../"
dockerfile: "./deploy/dockerfile"
target: development
restart: always
services:
web:
<<: *app-container
links:
- mysql
ports:
- "8000:8000"
environment:
- HOST
command: >
sh -c "uwsgi --ini uwsgi.ini"
mysql:
image: mysql:8.0.31
ports:
- "3306:3306"
environment:
- MYSQL_HOST
- MYSQL_DB
- MYSQL_PASSWORD
- MYSQL_USER
volumes:
- ./db:/docker-entrypoint-initdb.d/:ro
Dockerfile
# Dockerfile
# Uses multi-stage builds requiring Docker 17.05 or higher
# See https://docs.docker.com/develop/develop-images/multistage-build/
# Creating a python base with shared environment variables
FROM python:3.10-slim as python-base
ENV PYTHONUNBUFFERED=1
PYTHONDONTWRITEBYTECODE=1
PIP_NO_CACHE_DIR=off
PIP_DISABLE_PIP_VERSION_CHECK=on
PIP_DEFAULT_TIMEOUT=100
POETRY_HOME="/opt/poetry"
POETRY_VIRTUALENVS_IN_PROJECT=true
POETRY_NO_INTERACTION=1
PYSETUP_PATH="/opt/pysetup"
VENV_PATH="/opt/pysetup/.venv"
ENV PATH="$POETRY_HOME/bin:$VENV_PATH/bin:$PATH"
# builder-base is used to build dependencies
FROM python-base as builder-base
RUN apt-get update
&& apt-get install --no-install-recommends -y
curl
build-essential
# Install Poetry - respects $POETRY_VERSION & $POETRY_HOME
ENV POETRY_VERSION=1.2.2
RUN curl -sSL https://install.python-poetry.org | python
# We copy our Python requirements here to cache them
# and install only runtime deps using poetry
WORKDIR $PYSETUP_PATH
COPY ./poetry.lock ./pyproject.toml ./
RUN poetry install --no-dev # respects
# 'development' stage installs all dev deps and can be used to develop code.
# For example using docker-compose to mount local volume under /app
FROM python-base as development
# Copying poetry and venv into image
COPY --from=builder-base $POETRY_HOME $POETRY_HOME
COPY --from=builder-base $PYSETUP_PATH $PYSETUP_PATH
# venv already has runtime deps installed we get a quicker install
WORKDIR $PYSETUP_PATH
RUN poetry install
WORKDIR /
COPY ./src /app
COPY ./src/uwsgi.ini /app/uwsgi.ini
WORKDIR /app/
Command line output
=> [builder-base 3/5] WORKDIR /opt/pysetup 0.0s
=> [builder-base 4/5] COPY ./poetry.lock ./pyproject.toml ./ 0.0s
=> ERROR [builder-base 5/5] RUN poetry install # respects 9.7s
------
> [builder-base 5/5] RUN poetry install # respects:
#10 0.950 Creating virtualenv flask-user-module in /opt/pysetup/.venv
#10 1.954 Installing dependencies from lock file
#10 2.157
#10 2.157 Package operations: 11 installs, 0 updates, 0 removals
#10 2.157
#10 2.158 • Installing markupsafe (2.1.1)
#10 3.916 • Installing click (8.1.3)
#10 3.918 • Installing itsdangerous (2.1.2)
#10 3.921 • Installing jinja2 (3.1.2)
#10 3.924 • Installing werkzeug (2.2.2)
#10 5.534 • Installing flask (2.2.2)
#10 5.534 • Installing mysqlclient (2.1.1)
#10 5.538 • Installing pymysql (1.0.2)
#10 9.285
#10 9.285 CalledProcessError
#10 9.285
#10 9.285 Command '['/opt/pysetup/.venv/bin/python', '-m', 'pip', 'install', '--use-pep517', '--disable-pip-version-check', '--prefix', '/opt/pysetup/.venv', '--no-deps', '/root/.cache/pypoetry/artifacts/af/19/9f/f71f7f0d313981e3dce1608dc021f6f4a338dd61aa21f8e1bbeb8a1deb/mysqlclient-2.1.1.tar.gz']' returned non-zero exit status 1.
#10 9.285
#10 9.285 at /usr/local/lib/python3.10/subprocess.py:526 in run
#10 9.357 522│ # We don't call process.wait() as .__exit__ does that for us.
#10 9.357 523│ raise
#10 9.357 524│ retcode = process.poll()
#10 9.358 525│ if check and retcode:
#10 9.358 → 526│ raise CalledProcessError(retcode, process.args,
#10 9.358 527│ output=stdout, stderr=stderr)
#10 9.358 528│ return CompletedProcess(process.args, retcode, stdout, stderr)
#10 9.358 529│
#10 9.358 530│
#10 9.358
#10 9.358 The following error occurred when trying to handle this error:
#10 9.359
#10 9.359
#10 9.359 EnvCommandError
#10 9.359
#10 9.360 Command ['/opt/pysetup/.venv/bin/python', '-m', 'pip', 'install', '--use-pep517', '--disable-pip-version-check', '--prefix', '/opt/pysetup/.venv', '--no-deps', '/root/.cache/pypoetry/artifacts/af/19/9f/f71f7f0d313981e3dce1608dc021f6f4a338dd61aa21f8e1bbeb8a1deb/mysqlclient-2.1.1.tar.gz'] errored with the following return code 1, and output:
#10 9.360 Processing /root/.cache/pypoetry/artifacts/af/19/9f/f71f7f0d313981e3dce1608dc021f6f4a338dd61aa21f8e1bbeb8a1deb/mysqlclient-2.1.1.tar.gz
#10 9.360 Installing build dependencies: started
#10 9.360 Installing build dependencies: finished with status 'done'
#10 9.360 Getting requirements to build wheel: started
#10 9.360 Getting requirements to build wheel: finished with status 'error'
#10 9.360 error: subprocess-exited-with-error
#10 9.360
#10 9.360 × Getting requirements to build wheel did not run successfully.
#10 9.360 │ exit code: 1
#10 9.360 ╰─> [27 lines of output]
#10 9.360 mysql_config --version
#10 9.360 /bin/sh: 1: mysql_config: not found
#10 9.360 mariadb_config --version
#10 9.360 /bin/sh: 1: mariadb_config: not found
#10 9.360 mysql_config --libs
#10 9.360 /bin/sh: 1: mysql_config: not found
#10 9.360 Traceback (most recent call last):
#10 9.360 File "/opt/pysetup/.venv/lib/python3.10/site-packages/pip/_vendor/pep517/in_process/_in_process.py", line 363, in <module>
#10 9.360 main()
#10 9.360 File "/opt/pysetup/.venv/lib/python3.10/site-packages/pip/_vendor/pep517/in_process/_in_process.py", line 345, in main
#10 9.360 json_out['return_val'] = hook(**hook_input['kwargs'])
#10 9.360 File "/opt/pysetup/.venv/lib/python3.10/site-packages/pip/_vendor/pep517/in_process/_in_process.py", line 130, in get_requires_for_build_wheel
#10 9.360 return hook(config_settings)
#10 9.360 File "/tmp/pip-build-env-xebq6tlg/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 338, in get_requires_for_build_wheel
#10 9.360 return self._get_build_requires(config_settings, requirements=['wheel'])
#10 9.360 File "/tmp/pip-build-env-xebq6tlg/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 320, in _get_build_requires
#10 9.360 self.run_setup()
#10 9.360 File "/tmp/pip-build-env-xebq6tlg/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 483, in run_setup
#10 9.360 super(_BuildMetaLegacyBackend,
#10 9.360 File "/tmp/pip-build-env-xebq6tlg/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 335, in run_setup
#10 9.360 exec(code, locals())
#10 9.360 File "<string>", line 15, in <module>
#10 9.360 File "/tmp/pip-req-build-xvtg4k3u/setup_posix.py", line 70, in get_config
#10 9.360 libs = mysql_config("libs")
#10 9.360 File "/tmp/pip-req-build-xvtg4k3u/setup_posix.py", line 31, in mysql_config
#10 9.360 raise OSError("{} not found".format(_mysql_config_path))
#10 9.360 OSError: mysql_config not found
#10 9.360 [end of output]
#10 9.360
#10 9.360 note: This error originates from a subprocess, and is likely not a problem with pip.
#10 9.360 error: subprocess-exited-with-error
#10 9.360
#10 9.360 × Getting requirements to build wheel did not run successfully.
#10 9.360 │ exit code: 1
#10 9.360 ╰─> See above for output.
#10 9.360
#10 9.360 note: This error originates from a subprocess, and is likely not a problem with pip.
#10 9.360
#10 9.360
#10 9.360 at /opt/poetry/venv/lib/python3.10/site-packages/poetry/utils/env.py:1476 in _run
#10 9.428 1472│ output = subprocess.check_output(
#10 9.428 1473│ command, stderr=subprocess.STDOUT, env=env, **kwargs
#10 9.428 1474│ )
#10 9.428 1475│ except CalledProcessError as e:
#10 9.428 → 1476│ raise EnvCommandError(e, input=input_)
#10 9.429 1477│
#10 9.429 1478│ return decode(output)
#10 9.429 1479│
#10 9.429 1480│ def execute(self, bin: str, *args: str, **kwargs: Any) -> int:
#10 9.429 Failed to install /root/.cache/pypoetry/artifacts/af/19/9f/f71f7f0d313981e3dce1608dc021f6f4a338dd61aa21f8e1bbeb8a1deb/mysqlclient-2.1.1.tar.gz
#10 9.429
#10 9.429 at /opt/poetry/venv/lib/python3.10/site-packages/poetry/utils/pip.py:51 in pip_install
#10 9.431 47│
#10 9.431 48│ try:
#10 9.431 49│ return environment.run_pip(*args)
#10 9.431 50│ except EnvCommandError as e:
#10 9.432 → 51│ raise PoetryException(f"Failed to install {path.as_posix()}") from e
#10 9.432 52│
#10 9.432
------
executor failed running [/bin/sh -c poetry install # respects]: exit code: 1
ERROR: Service 'web' failed to build : Build failed
Update
(flask-user-module-py3.10) PS D:Projectsuser-moduledeploy> docker-compose -f docker-compose.yml --env-file ./web-variables.env build
mysql uses an image, skipping
Building web
[+] Building 16.3s (10/17)
=> [internal] load build definition from dockerfile 0.0s
=> => transferring dockerfile: 1.78kB 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/python:3.10-slim 1.3s
=> [internal] load build context 0.0s
=> => transferring context: 598B 0.0s
=> CACHED [python-base 1/1] FROM docker.io/library/python:3.10-slim@sha256:685b1c2ef40bd3ded77b3abd0965d5c16d19a20469be0ac06a3cf1d33f2e6d41 0.0s
=> CACHED [builder-base 1/5] RUN apt-get update && apt-get install --no-install-recommends -y curl build-essential default-libmysqlclient-dev 0.0s
=> CACHED [builder-base 2/5] RUN curl -sSL https://install.python-poetry.org | python 0.0s
=> CACHED [builder-base 3/5] WORKDIR /opt/pysetup 0.0s
=> CACHED [builder-base 4/5] COPY ./poetry.lock ./pyproject.toml ./ 0.0s
=> ERROR [builder-base 5/5] RUN poetry install # respects 14.8s
#10 3.601 • Installing werkzeug (2.2.2)
#10 5.295 • Installing flask (2.2.2)
#10 5.296 • Installing mysqlclient (2.1.1)
#10 5.297 • Installing pymysql (1.0.2)
#10 10.25 • Installing flask-mysql (1.5.2)
#10 10.25 • Installing flask-mysqldb (1.0.1)
#10 10.25 • Installing flask-paginate (2022.1.8)
#10 14.64
#10 14.64 /opt/pysetup/flask_user_module does not contain any element
------
executor failed running [/bin/sh -c poetry install # respects]: exit code: 1
ERROR: Service 'web' failed to build : Build failed
2
Answers
It seems mysql_config is missing in your
web
image. I guess you need to change this line to:If one above doesn’t work, try to install
python-dev
andpython-MySQLdb
I think it might work if, in your
Dockerfile
, you add the--no-root
flag to the firstpoetry install
command. This tells poetry to skip the final step of installing the package root, which Docker does not have access to at this point.If this doesn’t work, I might have to take a look at your
pyproject.toml
file.