【问题标题】:Install Python mysqlclient on Ubuntu docker container在 Ubuntu docker 容器上安装 Python mysqlclient
【发布时间】:2017-10-12 03:08:26
【问题描述】:

我想在运行 Ubuntu 的 Docker 容器上安装 Python's mysqlclient 包。安装失败,因为我没有在容器中安装 gcc:

x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fno-strict-aliasing -Wdate-time -D_FORTIFY_SOURCE=2 -g -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Dversion_info=(1,3,7,'final',1) -D__version__=1.3.7 -I/usr/include/mysql -I/usr/include/python2.7 -c _mysql.c -o build/temp.linux-x86_64-2.7/_mysql.o -fabi-version=2 -fno-omit-frame-pointer
    unable to execute 'x86_64-linux-gnu-gcc': No such file or directory
    error: command 'x86_64-linux-gnu-gcc' failed with exit status 1

但是,我不想在容器中安装 gcc。是否有可用于 mysqlclient 的轮子?我找不到。

【问题讨论】:

    标签: python ubuntu docker


    【解决方案1】:

    您可以安装构建依赖项,制作模块,然后删除它们。

    Redis is a good example 了解如何一步构建和清理,这样您就不会创建庞大的图像层。

    RUN buildDeps='gcc libc6-dev make' \
        && set -x \
        && apt-get update && apt-get install -y $buildDeps --no-install-recommends \
        && rm -rf /var/lib/apt/lists/* \
        && mkdir -p /usr/src/redis \
        && curl -sSL "$REDIS_DOWNLOAD_URL" -o redis.tar.gz \
        && echo "$REDIS_DOWNLOAD_SHA1 *redis.tar.gz" | sha1sum -c - \
        && tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
        && rm redis.tar.gz \
        && make -C /usr/src/redis \
        && make -C /usr/src/redis install \
        && rm -r /usr/src/redis \
        && apt-get purge -y --auto-remove $buildDeps
    

    【讨论】:

    • 我正在考虑这样做。我想避免这样做,因为 apt-get 表明 gcc 有很多依赖项。相反,我将在另一个包含所有内容的容器中构建并生成一个轮子,我将把它复制到我将实际使用的容器中。我认为可以为 Linux 生成一个轮子并重用它(我问是因为这样的轮子不存在)。
    【解决方案2】:

    我创建了一个容器并安装了构建 mysqlclient 所需的一切。我下载了 .tgz 并使用 python setup.py bdist_wheel 生成了 Wheel 文件。我将wheel文件复制到从我的主机安装的目录中,并将其安装在我想要安装mysqlclient的容器上。这样我就不必删除我下载的包。我使用 gcc 将容器实例保存为单独的图像以供将来使用。

    【讨论】:

      【解决方案3】:

      当您需要编译内容但又不想用构建内容污染图像时,一个很好的解决方案是使用multi-stage builds

      通过多阶段构建,您可以使用编译所需的所有工具和数据构建第一个映像,然后构建第二个映像,您只复制第一个映像的结果。如果您需要一些秘密(例如 SSH 密钥来访问 git 私有存储库)但不希望这些秘密出现在最终映像中,它也很有用。

      【讨论】:

        猜你喜欢
        • 2015-08-19
        • 1970-01-01
        • 1970-01-01
        • 2019-06-18
        • 1970-01-01
        • 2023-01-18
        相关资源
        最近更新 更多