docker在alpine linux中构建python django应用程序时出错

Posted

技术标签:

【中文标题】docker在alpine linux中构建python django应用程序时出错【英文标题】:error when docker build python django app in alpine linux 【发布时间】:2019-02-09 01:16:27 【问题描述】:
    Dockerfile
FROM python:3.6.5-alpine3.7
WORKDIR /app
ADD . /app
RUN pip install --no-cache-dir -r requirements.txt
EXPOSE 10021
CMD ["python", "manage.py", "runserver", "0.0.0.0:10021"]

    要求

    openpyxl==2.4.11 请求==2.18.4 Django==2.0.2 mysqlclient==1.3.12

    构建错误
Collecting mysqlclient==1.3.12 (from -r requirements.txt (line 4))
  Downloading https://mirrors.aliyun.com/pypi/packages/6f/86/bad31f1c1bb0cc99e88ca2adb7cb5c71f7a6540c1bb001480513de76a931/mysqlclient-1.3.12.tar.gz (89kB)
    Complete output from command python setup.py egg_info:
    /bin/sh: mysql_config: not found
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-install-er3m_9t6/mysqlclient/setup.py", line 17, in <module>
        metadata, options = get_config()
      File "/tmp/pip-install-er3m_9t6/mysqlclient/setup_posix.py", line 44, in get_config
        libs = mysql_config("libs_r")
      File "/tmp/pip-install-er3m_9t6/mysqlclient/setup_posix.py", line 26, in mysql_config
        raise EnvironmentError("%s not found" % (mysql_config.path,))
    OSError: mysql_config not found

感谢@danblack mariadb-connector-c-dev 帮助我解决了OSError: mysql_config not found 错误。


    新的 Dockerfile
FROM python:3.6.5-alpine3.7
WORKDIR /app
ADD . /app
RUN apk add --no-cache build-base && apk add --no-cache mariadb-connector-c-dev && pip install --no-cache-dir -r requirements.txt && apk del build-base
EXPOSE 10021
CMD ["python", "manage.py", "runserver", "0.0.0.0:10021"]

    新问题

但是出现了一个新问题,当docker run ... 运行时,Docker 没有打印任何内容,没有日志,没有错误。它应该打印如下日志

Performing system checks... 
System check identified no issues (0 silenced). 
September 04, 2018 - 15:56:26 
Django version 2.0.2, using settings 'xxx.settings' 
Starting development server at http://0.0.0.0:10021/ 
Quit the server with CTRL-BREAK.

谁能给我看一个完整的 Dockerfile?请帮忙!非常感谢。

【问题讨论】:

我的新旧Dockerfile 一定有问题,因为我用FROM centos/python-36-centos7 成功运行了这个django 应用程序。但是我想用FROM python:3.6.5-alpine3.7由于基本的图片大小,请帮帮我,谢谢大家。 这是一个新问题,应该这样问。我希望你解决了。一旦回答问题,没有人会注意到问题的重大变化。 【参考方案1】:

根据@danblack,主要需要安装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

【讨论】:

【参考方案2】:

您需要安装mariadb-connector-c-dev alpine 包,它提供了mysql_config,python 包使用它来识别它需要链接的库。

【讨论】:

谢谢,docker build 运行成功,但是docker run -p ...,没有-d,没有工作并且什么也没打印。 PS,源代码可以在我的宿主机上成功运行。 你必须多解释一下“没用”,但这听起来像是一个新问题。 我很抱歉,但是当我在主机(Centos7.4)中运行docker run -p ... 时,它什么也没打印,所以我不知道发生了什么。 Docker 应该像Performing system checks... System check identified no issues (0 silenced). September 04, 2018 - 15:56:26 Django version 2.0.2, using settings 'xxx.settings' Starting development server at http://0.0.0.0:10021/ Quit the server with CTRL-BREAK. 一样打印,但是什么也没有。没有日志。没有错误。 docker exec -ti containername ash 看看发生了什么。

以上是关于docker在alpine linux中构建python django应用程序时出错的主要内容,如果未能解决你的问题,请参考以下文章

Docker: Alpine Linux升级且安装openssh导致构建凉凉排查修正

Docker: Alpine Linux升级且安装openssh导致构建凉凉排查修正

Docker: Alpine Linux升级且安装openssh导致构建凉凉排查修正

Docker: Alpine Linux升级且安装openssh导致构建凉凉排查修正

构建属于自己的 jre Docker 镜像

VirtualBox中Alpine Linux + Docker安装记录