Docker Alpine:加载MySQLdb模块时出错

时间:2019-05-08 20:32:43

标签: mysql django docker mariadb alpine

我正在使用 MariaDB 构建 Django 应用程序的基于 Alpine 的映像,但我不知道应该添加哪个依赖项我的Dockerfile,以便我的应用可以正确连接到数据库。

django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?

好吧,我以为我做到了。根据我读到的in this article,在this discussion中,mariadb-dev Alpine 中与基于 Debian default-libmysqlclient-dev系统。此外,Alpine中的mysql-client package只是一个伪包(包含 mariadb-dev mariadb-client 等)。这是Dockerfile

# pull official base image
FROM python:3.7-alpine

# set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# set work directory
WORKDIR /usr/src/cms

# install mysqlclient
RUN apk update \
    && apk add --virtual build-deps gcc python3-dev musl-dev \
    && apk add --no-cache mariadb-dev\
    && apk del build-deps

# install dependencies
RUN pip install --upgrade pip
RUN pip install pipenv
COPY ./Pipfile /usr/src/cms/Pipfile
RUN pipenv install --skip-lock --system --dev

# copy entrypoint.sh
COPY ./entrypoint.sh /usr/src/cms/entrypoint.sh

# copy project
COPY . /usr/src/cms/

# run entrypoint.sh
ENTRYPOINT ["/usr/src/cms/entrypoint.sh"]

我尝试添加mariadb-client,改为使用mysql-client。 我还尝试添加RUN pip install django-mysql。一切似乎都没有改变。我成功地构建了 Postgres Django应用程序,没有任何问题,但是当涉及MySQl vs MariaDB // Debian vs Alpine时,我感到困惑。有见识吗?

2 个答案:

答案 0 :(得分:1)

似乎您缺少MySQLdb Python模块,应该为此安装mysqlclient Python软件包:pip install mysqlclient

在Alpine上,pip将从源代码构建mysqlclient,因此此设置步骤需要gccmusl-dev,因此您需要推迟apk del build-deps安装完Python模块之后。

固定的Dockerfile代码段:

RUN apk update \
    && apk add --virtual build-deps gcc python3-dev musl-dev \
    && apk add --no-cache mariadb-dev

...

RUN pip install mysqlclient  

RUN apk del build-deps

答案 1 :(得分:0)

主要是你需要安装 mariadb-connector-c-dev 包。但只有这个包会出现编译错误。因此,您还需要将 gcc 和 musl-dev 包添加到 Dockerfile 中。这将使 Django 和 MySQL 在 alpine 镜像中工作。

FROM python:3.8-alpine

RUN apk add gcc musl-dev mariadb-connector-c-dev