【问题标题】:Docker image taking long to build构建 Docker 映像需要很长时间
【发布时间】:2020-08-19 21:48:45
【问题描述】:

这是 Dockerfile 的内容,我从 alpine 映像更改为 slim-buster 映像。我真的很难理解为什么它花了这么长时间我认为它与所有的 aps 即时更新和安装在 apt-get update 中有关。我可能正在重新安装我可能不需要的软件包或做一些我不需要的事情,有什么方法可以加快速度吗?

# pull official base image
FROM python:3.8-slim-buster

# set work directory
WORKDIR /opt/workspace

# set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# Need this crap for wkhtml old install because any version after this doesn't work with charts and javascript
RUN echo "deb http://security.debian.org/debian-security jessie/updates main" >> /etc/apt/sources.list

# Pillow and Psycopg Dependencies
RUN apt-get update && apt-get install -y --no-install-recommends \
        build-essential \
        wget \ 
        libpq-dev \
        libpng-dev \
        libjpeg-dev \
        python-dev \
        postgresql-client \
        python3-pip \
        python3-setuptools \
        python3-wheel \
        python3-cffi \
        libssl1.0.0 \
        libpng12-0 \
        xfonts-base \
        xfonts-75dpi \
        libcairo2 \
        libpango-1.0-0 \
        libpangocairo-1.0-0 \
        libgdk-pixbuf2.0-0 \
        libffi-dev \
        shared-mime-info\
        gcc \
        musl-dev \
        python3-dev \
        tk-dev \
        uuid-dev \ 
    && rm -rf /var/lib/apt/lists/*

# fetch wait for it script
RUN wget -q -O /usr/bin/wait-for-it https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh && \
    chmod +x /usr/bin/wait-for-it

RUN pip install psycopg2

# bunch of wkhtmltopdf shit only works with charts on this image.
RUN wget http://archive.ubuntu.com/ubuntu/pool/main/libj/libjpeg-turbo/libjpeg-turbo8_2.0.3-0ubuntu1_amd64.deb
RUN dpkg -i libjpeg-turbo8_2.0.3-0ubuntu1_amd64.deb

RUN wget https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.2.1/wkhtmltox-0.12.2.1_linux-trusty-amd64.deb
RUN dpkg -i wkhtmltox-0.12.2.1_linux-trusty-amd64.deb

# Install Dependencies
COPY requirements.txt /opt/workspace/requirements.txt
RUN pip install --no-cache-dir -r requirements.txt

# copy entrypoint.sh
COPY ./entrypoint.sh /opt/workspace/entrypoint.sh

# copy project
COPY . /opt/workspace

# run entrypoint.sh
ENTRYPOINT ["/opt/workspace/entrypoint.sh"]

编辑: 收到答案后,我已将 dockerfile 更新为以下内容。请记住,我需要使用 apt-get 安装的唯一软件包是 wkhtmltopdf 运行所需的软件包!它现在运行得更快了,而且工作得更好了。

FROM python:3.8-slim-buster

# set work directory
WORKDIR /opt/workspace

# set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
ENV DEBIAN_FRONTEND=noninteractive

# Need this crap for wkhtml old install
RUN echo "deb http://security.debian.org/debian-security jessie/updates main" >> /etc/apt/sources.list

RUN apt-get update && apt-get install -y --no-install-recommends \
        wget \
        fontconfig \
        xfonts-base \
        xfonts-75dpi \
        libssl1.0.0 \
        libpq-dev \
        libpng-dev \
        libjpeg-dev \
        libffi-dev \
        libpng12-0 \
        libxext6 \
        libx11-6 \
        libxrender1 \ 
        gcc \
    && rm -rf /var/lib/apt/lists/*

# fetch wait for it script
RUN wget -q -O /usr/bin/wait-for-it https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh && \
    chmod +x /usr/bin/wait-for-it

# bunch of wkhtmltopdf shit only works with charts on this image.
RUN wget http://archive.ubuntu.com/ubuntu/pool/main/libj/libjpeg-turbo/libjpeg-turbo8_2.0.3-0ubuntu1_amd64.deb
RUN dpkg -i libjpeg-turbo8_2.0.3-0ubuntu1_amd64.deb

RUN wget https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.2.1/wkhtmltox-0.12.2.1_linux-trusty-amd64.deb
RUN dpkg -i wkhtmltox-0.12.2.1_linux-trusty-amd64.deb

# Install Dependencies
COPY requirements.txt /opt/workspace/requirements.txt
RUN pip install --no-cache-dir -r requirements.txt

# copy entrypoint.sh
COPY ./entrypoint.sh /opt/workspace/entrypoint.sh

# copy project
COPY . /opt/workspace

# run entrypoint.sh
ENTRYPOINT ["/opt/workspace/entrypoint.sh"]

【问题讨论】:

  • 定义“长”。几分钟可能是完全愉快的。还是我们在谈论小时?究竟哪一步需要很长时间?
  • 在 30 分钟或更长时间内,它的 RUN apt-get update && apt-get install -y --no-install-recommends 步骤需要很长时间才能构建,一切都成功构建,以前从未有过如此长时间的构建,但它只是初始构建。

标签: python docker dockerfile debian-buster


【解决方案1】:

这里有很多问题。首先,有一些你不需要的包:

  1. 您正在安装 python 两次。您正在安装 Debian Python 包 python,但 Docker python 映像有自己的 Python 版本(在 /usr/local 中),其中已经有开发头文件。你不需要这个,它可能会导致混淆,因为你最终会得到两个版本的 Python (https://pythonspeed.com/articles/importerror-docker/)。

  2. musl-dev 是不必要的。 Debian 使用 glibc,而不是 musl。我怀疑这是 Alpine 的遗留问题。

  3. 您正在安装一个编译器,通常是一大堆 C 头文件,所有这些 *-dev 包。很有可能你根本不需要!在 Alpine 上,您需要编译所有内容,因为 Alpine 不能使用普通的二进制轮子。 (https://pythonspeed.com/articles/alpine-docker-python/) 既然你在 Debian 上,很可能你所有的依赖都有二进制轮子。你仍然需要一个编译器来编译你自己的代码,但如果它是纯 Python 则很可能不需要。

所以我的建议是:删除整个 apt-get 行。很有可能没有它也能正常工作。

【讨论】:

  • 感谢您的描述性回答。这就是我需要的。我确实相信我有时需要那些用于 weasyprint 或其他东西的 c 编译器,所以我可能会在使用其他东西时将其删除,我会接受这个答案作为解决方案,因为我相信这确实回答了我的问题。谢谢!
猜你喜欢
  • 2021-09-06
  • 1970-01-01
  • 1970-01-01
  • 2020-08-21
  • 1970-01-01
  • 2020-09-13
  • 2014-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多