过去,构建我们的气流部署的docker映像需要大约5分钟,而突然间,它花费了一个多小时。话虽如此,我们已经有几个月没有重建我们的形象了,所以不确定问题是什么时候出现的……
看起来https://stackoverflow.com/questions/65122957/resolving-new-pip-backtracking-runtime-issue
是罪魁祸首。在构建过程中,我们看到了很多类似这样的警告:
=> => # Downloading google_cloud_os_login-2.3.1-py2.py3-none-any.whl (42 kB)
=> => # INFO: This is taking longer than usual. You might need to provide the dependency resolver with stricter constraints
=> => # to reduce runtime. See https://pip.pypa.io/warnings/backtracking for guidance. If you want to abort this run, press
=> => # Ctrl + C.
=> => # Downloading google_cloud_os_login-2.2.1-py2.py3-none-any.whl (41 kB)
=> => # Downloading google_cloud_os_login-2.2.0-py2.py3-none-any.whl (44 kB)
下面是Dockerfile中耗时一小时的那行+
RUN set -ex
&& buildDeps='
freetds-dev
libkrb5-dev
libsasl2-dev
libssl-dev
libffi-dev
libpq-dev
git
'
&& apt-get update -yqq
&& apt-get install -yqq --no-install-recommends
$buildDeps
freetds-bin
build-essential
apt-utils
curl
rsync
netcat
locales
&& sed -i 's/^# en_US.UTF-8 UTF-8$/en_US.UTF-8 UTF-8/g' /etc/locale.gen
&& locale-gen
&& update-locale LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8
&& useradd -ms /bin/bash -d ${AIRFLOW_USER_HOME} airflow
&& pip install -U pip setuptools wheel
&& pip install pytz
&& pip install pyOpenSSL
&& pip install ndg-httpsclient
&& pip install pyasn1
&& pip install apache-airflow[crypto,postgres,slack,kubernetes,gcp,docker,ssh]==${AIRFLOW_VERSION}
&& if [ -n "${PYTHON_DEPS}" ]; then pip install ${PYTHON_DEPS}; fi
&& apt-get purge --auto-remove -yqq $buildDeps
&& apt-get autoremove -yqq --purge
&& apt-get clean
&& rm -rf
/tmp/*
/var/tmp/*
/usr/share/man
/usr/share/doc
/usr/share/doc-base
/var/lib/apt/lists/*
...
...
COPY requirements.txt /requirements.txt
RUN pip install -r /requirements.txt
这是requirements.txt
google-cloud-core==1.4.1
google-cloud-datastore==1.15.0
gcsfs==0.6.1
flatten-dict==0.4.2
bigquery_schema_generator==1.4
backoff==1.11.1
six==1.13.0
ndjson==0.3.1
pymongo==3.1.2
SQLAlchemy==1.3.15
pandas==1.3.1
numpy==1.21.1
billiard
我实际上很困惑关于google_cloud_os_login
的这个特定的警告消息,因为挂起的构建步骤是我从RUN set -ex
开始共享的行,它看起来没有任何谷歌云安装?我们通过requirements.txt (-core, -datastore)安装一些google cloud的东西,但是在我们的dockerfile中,COPY和RUN pip install在requirements.txt上的行要少得多(如…所示)。许多库都会弹出这些警告,但是看起来google_cloud_os_login
确实是占用大量时间的罪魁祸首。
在RUN set -ex ...
命令的哪里提示安装google_cloud_os_login
?我们如何在这个库上设置一个特定的版本号来加快docker镜像的构建?
我想你看到的各种google包都是apache-airflow[gcp]
的依赖项。
为了加快安装速度,文档建议您使用他们提供的约束文件之一。它们创建名为constraints-<version>
的标签,其中包含可以通过--constraint
传递给pip的文件。
例如,当试图安装2.2.0时,有一个constraints-2.2.0
标记。在这个标记的文件树中,您将看到像constraints-3.8.txt
这样的文件,其中3.8
是我正在使用的python版本。
pip install apache-airflow[gcp]==2.2.0 --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-2.2.0/constraints-3.8.txt"