Repetida instalação de um pacote dentro da imagem do docker

0

Eu criei um pacote python chamado my-package . Eu não tenho intenção de torná-lo público, então a instalação é principalmente através de nossos servidores internos. Recentemente, um desenvolvedor sênior criou uma arquitetura usando o docker no qual o aplicativo é hospedado e my-package é uma dependência.

O problema é que, para testar o pacote, REPETITEMENTE preciso COPIAR meu código na imagem do docker, depois desinstalar a versão antiga do pacote e reinstalar a partir do código local.

  1. Reconstruir a imagem inteira leva novamente meia hora. - Não é uma opção.
  2. Crie outro Dockerfile FROM imagem existente e execute apenas comandos específicos para COPY e instale o pacote pip. - Minha solução atual ainda não é muito eficiente.

Tenho certeza de que os usuários do estivador teriam se deparado com essa questão, portanto, precisam de uma opinião especializada sobre a maneira mais eficiente de lidar com isso.

UPDATE: o 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

A parte importante está no final.

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"]

Como você pode ver, copio my-package2 da minha máquina local para a imagem e executo a instalação do pip.

  1. O tamanho da imagem está aumentando a cada vez que eu reconstruo a imagem.
  2. O volume é definitivamente uma opção que ainda não experimentei. Eu já uso o script/shell.sh que tem apenas $@ . Eu defino isso como ponto de entrada e executo qualquer comando que eu queira executar dentro da imagem sem muita barganha.
  3. Eu uso o docker-compose, então toda vez que eu reconstruo com a nova tag, também preciso atualizar no docker-compose. Ao longo do tempo, torna-se chato fazer isso por uma única alteração de linha no código.
por Tejas Jayasheel 07.12.2017 / 05:57

1 resposta

1

Você precisará compartilhar um pouco do seu dockerfile para que possamos entender por que Demora tanto tempo para instalar o pacote pip. Se você deseja otimizá-lo, essas referências podem ajudar:

Uma solução alternativa é, em vez de criar uma imagem para teste, basta usar o pacote do host através do parâmetro Docker de -v /host/directory:/container/directory .

Isso permitirá que você teste imediatamente seu pacote no contexto do recipiente, então você só criará a imagem de produção quando o teste está completo.

Mais informações podem ser encontradas, por exemplo: Noções básicas sobre volumes no Docker .

A partir do seu dockerfile publicado, parece que quase tudo é para instalar dependências. Para testes, você pode criar uma imagem onde todas essas dependências já instalado, em seguida, basta repetir o último passo para instalar o seu aplicativo de cada vez para testes.

Para facilitar a leitura, você pode finalmente escrever o dockerfile como vários estágios , para separar a construção de dependências da produção e talvez também para gerar apenas uma construção de produção final mínima. o A instrução ONBUILD pode ser útil aqui.

Só você sabe o que está tentando alcançar e quais são suas restrições. Os links acima podem servir como ponto de partida, e há muitos mais artigos a serem encontrados sobre o assunto.

    
por 24.12.2017 / 11:10

Tags