Docker Alpine:加载 MySQLdb 模块时出错

Posted

技术标签:

【中文标题】Docker Alpine:加载 MySQLdb 模块时出错【英文标题】:Docker Alpine: Error loading MySQLdb module 【发布时间】:2019-09-26 15:40:26 【问题描述】:

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

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

嗯,我以为我做到了。从我读到的in this article,在this discussion 中,mariadb-devAlpine 中相当于基于 Debian 的系统中的default-libmysqlclient-dev。此外,Alpine 中的mysql-client package 只是一个虚拟包(包含 mariadb-devmariadb-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 与 MariaDB // Debian 与 Alpine 时,我感到很困惑。有什么见解吗?

【问题讨论】:

【参考方案1】:

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

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

修复 Dockerfile sn-p:

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

【讨论】:

我做的完全一样,但仍然收到同样的错误。你能帮忙吗? 是的。也不适合我。依赖构建的漫长而漫长的崩溃。 唯一必要的依赖是mariadb-connector-c。无需安装大肥mariadb-dev 为了澄清@Rockallite 的评论,你只需要mariadb-connector-c 来让mysqlclient python 模块在安装后运行,但你需要mariadb-dev 来构建它。如果你想缩小你的 Docker 镜像,这是相关的。 这样您就可以安装 mariadb-dev 来构建并稍后卸载它并仅使用 mariadb-connector-c 保留【参考方案2】:

主要需要安装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

【讨论】:

以上是关于Docker Alpine:加载 MySQLdb 模块时出错的主要内容,如果未能解决你的问题,请参考以下文章

「容器架构」Debian和 Alpine作为基准Docker映像的对比

docker制作alpine初始镜像

docker实例-alpine-nginx

Alpine linux安装docker

Docker之Alpine制作镜像且上传至阿里云

Docker:如何将 bash 与基于 Alpine 的 docker 映像一起使用?