Я собрал пакет python под названием my-package
. Я не собираюсь делать это общедоступным, поэтому установка происходит в основном через наши внутренние серверы. Недавно один старший разработчик создал архитектуру с использованием docker, где размещается приложение, а my-package
является зависимостью.
Проблема в том, чтобы протестировать пакет, мне ПОВТОРНО нужно скопировать мой код в образ докера, затем удалить старую версию пакета и переустановить из локального кода.
- Восстановление всего изображения снова занимает полчаса. - Не вариант.
- Создайте еще один Dockerfile FROM из существующего образа и выполните только определенные команды, чтобы скопировать и установить пакет pip. - Мое текущее решение пока не очень эффективно.
Я уверен, что пользователи докеров столкнулись бы с этой проблемой, поэтому нужно мнение эксперта о наиболее эффективном способе решения этой проблемы.
ОБНОВЛЕНИЕ: Dockerfile
# VERSION 1.8.2
# AUTHOR: Matthieu "Puckel_" Roisil
# DESCRIPTION: Basic Airflow container
# BUILD: docker build --rm -t puckel/docker-airflow .
# SOURCE: https://github.com/puckel/docker-airflow
FROM ubuntu:17.10
MAINTAINER Puckel_
# Never prompts the user for choices on installation/configuration of packages
ENV DEBIAN_FRONTEND noninteractive
ENV TERM linux
# Airflow
ARG AIRFLOW_VERSION=1.8.9
ARG AIRFLOW_HOME=/usr/local/airflow
# Define en_US.
ENV LANGUAGE en_US.UTF-8
ENV LANG en_US.UTF-8
ENV LC_ALL en_US.UTF-8
ENV LC_CTYPE en_US.UTF-8
ENV LC_MESSAGES en_US.UTF-8
ENV LC_ALL en_US.UTF-8
ENV MATPLOTLIBRC /etc
RUN set -ex \
&& buildDeps=' \
python3.6-dev \
libkrb5-dev \
libsasl2-dev \
libssl-dev \
libffi-dev \
build-essential \
libblas-dev \
liblapack-dev \
libpq-dev \
git \
wget \
' \
&& apt-get update -yqq \
&& apt-get dist-upgrade -yqq \
&& apt-get install -yqq --no-install-recommends \
$buildDeps \
python3.6 \
python3.6-tk \
apt-utils \
curl \
netcat \
locales \
ca-certificates \
sudo \
libmysqlclient-dev \
&& ln -s /usr/bin/python3.6 /usr/bin/python \
&& 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_HOME} -u 1500 airflow \
&& mkdir ${AIRFLOW_HOME}/logs \
&& wget https://bootstrap.pypa.io/get-pip.py \
&& python get-pip.py \
&& rm -rf get-pip.py \
&& python -m pip install Cython \
&& python -m pip install requests \
&& python -m pip install pytz \
&& python -m pip install pyOpenSSL \
&& python -m pip install ndg-httpsclient \
&& python -m pip install pyasn1 \
&& python -m pip install Flask-OAuthlib \
&& python -m pip install apache-airflow[crypto,celery,postgres,ldap,jdbc,mysql,s3,samba]==$AIRFLOW_VERSION \
&& python -m pip install celery[redis]==4.1.0 \
&& python -m pip install boto3 \
&& python -m pip install pymongo \
&& python -m pip install statsd \
&& apt-get remove --purge -yqq $buildDeps \
&& apt-get clean \
&& rm -rf \
/var/lib/apt/lists/* \
/tmp/* \
/var/tmp/* \
/usr/share/man \
/usr/share/doc \
/usr/share/doc-base \
&& apt-get autoremove -yqq
Важная часть в конце.
ARG CACHEBUST=1
COPY config/matplotlibrc /etc/matplotlibrc
COPY script/entrypoint.sh /entrypoint.sh
COPY script/shell.sh /shell.sh
COPY config/airflow.cfg ${AIRFLOW_HOME}/airflow.cfg
RUN chown -R airflow: ${AIRFLOW_HOME}
RUN pip install matplotlib seaborn xlsxwriter pandas Jinja2
#Add custom PIP repo - THIS IS OF INTEREST
COPY config/pip.conf /etc/pip.conf
RUN python -m pip install my-package
COPY my-package2 /usr/local/my-package2
# RUN pip uninstall my-package2
RUN python -m pip install /usr/local/my-package2
EXPOSE 8080 5555 8793
USER airflow
WORKDIR ${AIRFLOW_HOME}
ENTRYPOINT ["/entrypoint.sh"]
Как видите, я копирую my-package2 с моего локального компьютера в образ и запускаю pip install.
- Размер изображения увеличивается с каждым разом, когда я перестраиваю его.
- Объемы, безусловно, вариант, который я еще не пробовал. Я уже использую
script/shell.sh
котором только$@
. Я устанавливаю это как точку входа и запускаю любую команду, которую хочу запустить внутри изображения без особых затруднений. - Я использую docker-compose, поэтому каждый раз, когда я перестраиваюсь с новым тегом, мне нужно также обновлять в docker-compose. Со временем это становится раздражающим, чтобы сделать это из-за однострочного изменения кода.