การติดตั้งแพ็กเกจซ้ำภายในอิมเมจของ Docker


0

my-packageฉันสร้างแพคเกจหลามที่เรียกว่า ฉันไม่มีความตั้งใจที่จะเผยแพร่สู่สาธารณะดังนั้นการติดตั้งส่วนใหญ่ผ่านเซิร์ฟเวอร์ภายในของเรา เมื่อเร็ว ๆ นี้นักพัฒนาอาวุโสคนหนึ่งได้สร้างสถาปัตยกรรมโดยใช้นักเทียบท่าที่โฮสต์แอปพลิเคชันและmy-packageเป็นที่พึ่ง

ปัญหาคือเพื่อทดสอบแพคเกจฉันต้องทำซ้ำคัดลอกรหัสของฉันลงในอิมเมจ docker จากนั้นถอนการติดตั้งแพคเกจเวอร์ชันเก่าและติดตั้งใหม่จากรหัสท้องถิ่น

  1. การสร้างรูปภาพใหม่ทั้งหมดอีกครั้งใช้เวลาครึ่งชั่วโมง - ไม่ใช่ตัวเลือก
  2. สร้าง Dockerfile อื่นจากอิมเมจที่มีอยู่และรันเฉพาะคำสั่งเฉพาะเพื่อคัดลอกและติดตั้งแพ็กเกจ 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"]

อย่างที่คุณเห็นฉันคัดลอกแพ็คเกจของฉัน 2 จากเครื่องท้องถิ่นไปยังรูปภาพและเรียกใช้การติดตั้ง pip

  1. ขนาดภาพใหญ่ขึ้นทุกครั้งที่ฉันสร้างภาพใหม่
  2. เล่มเป็นตัวเลือกที่ฉันยังไม่ได้ลอง ฉันใช้ประโยชน์จากscript/shell.sh สิ่งที่มี$@อยู่แล้ว ฉันตั้งค่าเป็นจุดเริ่มต้นและเรียกใช้คำสั่งใด ๆ ที่ฉันต้องการเรียกใช้ภายในรูปภาพโดยไม่มีการต่อรองมาก
  3. ฉันใช้นักเทียบท่าเขียนดังนั้นทุกครั้งที่ฉันสร้างใหม่ด้วยแท็กใหม่ฉันต้องอัปเดตในนักเขียนที่ดีเช่นกัน เมื่อเวลาผ่านไปมันน่ารำคาญที่จะทำเช่นนี้สำหรับการเปลี่ยนแปลงบรรทัดเดียวในรหัส

1
ทำไมถึงไม่มีประสิทธิภาพ? นอกจากนี้สำหรับการสร้างภาพขึ้นมาใหม่ถ้าคุณทำให้มันเป็นเลเยอร์เพิ่มเติมมันควรปรับปรุงเวลาเช่นเดียวกับที่คุณมีตัวกลางอยู่ (สมมติว่าคุณไม่ได้ลบมันทุกครั้ง) อย่างน้อยนั่นก็เป็นความเข้าใจของฉันสำหรับนักเทียบท่า
เซ

1
ไม่ได้มีประสิทธิภาพมากเพราะ 1. ขนาดภาพเพิ่มขึ้นเรื่อย ๆ ในทุกครั้งที่ลอง (ไม่แน่ใจว่าเพราะเหตุใดในทางเทคนิคก็ไม่ควร) และ mac ของฉันมีหน่วยความจำไม่เพียงพอ 2. จำเป็นต้องติดแท็กสร้างใหม่และลบแท็กเก่าทุกครั้ง ค่อนข้างยุ่งยาก
Tejas Jayasheel

ฉันคิดว่าความคิดนั้นเป็นเสียง (รวมทั้งดูเหมือนว่าจะมีการตัดสินใจสำหรับคุณที่จะต้องใช้ Docker) ฉันคิดว่ามันจะดีกว่าที่จะมุ่งเน้นไปที่ปัญหาของการต้องคัดลอกรหัสของคุณซ้ำ ๆ นอกจากนี้เมื่อคุณเปลี่ยนรูปภาพของนักเทียบท่าชั้นเดียวก็ไม่ควรใช้เวลาครึ่งชั่วโมง บางทีคุณสามารถเปลี่ยนลำดับที่คุณทำสิ่งต่าง ๆ หรือรับคอมพิวเตอร์ที่เร็วขึ้น เพื่อให้คำแนะนำเกี่ยวกับเรื่องนี้เราจะต้องมีรายละเอียดเพิ่มเติมอย่างแน่นอน
mtak

คุณสามารถแชร์ dockerfile ของคุณให้มากพอเพื่อที่เราจะได้เข้าใจว่าทำไมมันใช้เวลานานมากในการติดตั้งแพ็กเกจ pip แต่คำถามแรก: ทำไมคุณไม่แทนการสร้างอิมเมจสำหรับการทดสอบเพียงใช้แพ็คเกจจากโฮสต์ผ่านพารามิเตอร์ของ-v /path/on/host:/path/in/container?
harrymc

1
เกือบทั้งหมดของ dockerfile กำลังติดตั้งการพึ่งพา ทำไมคุณไม่สร้างภาพที่มีทั้งหมดของพวกเขาเพียงแค่ทำซ้ำสองสามขั้นตอนสุดท้ายสำหรับการทดสอบในแต่ละครั้ง?
harrymc

คำตอบ:


1

คุณจะต้องแชร์ไฟล์ dockerfile ของคุณเพื่อให้เราสามารถเข้าใจได้ว่าทำไมจึงใช้เวลานานในการติดตั้งแพ็กเกจ pip หากคุณต้องการเพิ่มประสิทธิภาพการอ้างอิงเหล่านี้อาจช่วย:

-v /host/directory:/container/directoryวิธีการแก้ปัญหาอื่นเป็นแทนการสร้างภาพสำหรับการทดสอบเพียงแค่ใช้แพคเกจจากโฮสต์ผ่านพารามิเตอร์เทียบท่าของ

สิ่งนี้จะช่วยให้คุณทดสอบแพ็คเกจของคุณทันทีในบริบทของคอนเทนเนอร์ดังนั้นคุณจะสร้างอิมเมจการผลิตเมื่อการทดสอบเสร็จสมบูรณ์เท่านั้น

ข้อมูลอื่น ๆ อีกมากมายสามารถพบได้ตัวอย่างเช่น: ไดรฟ์ความเข้าใจในการเทียบท่า


จาก dockerfile ที่โพสต์ของคุณดูเหมือนว่าเกือบทั้งหมดมีไว้สำหรับติดตั้งการพึ่งพา สำหรับการทดสอบคุณสามารถสร้างภาพที่ติดตั้งการพึ่งพาเหล่านี้ทั้งหมดแล้วเพียงแค่ทำซ้ำขั้นตอนสุดท้ายสำหรับการติดตั้งแอปพลิเคชันของคุณในแต่ละครั้งสำหรับการทดสอบ

เพื่อให้สามารถอ่านได้ในที่สุดคุณสามารถเขียน dockerfile เป็น แบบหลายขั้นตอนเพื่อแยกการพึ่งพาการสร้างจากการผลิตและอาจสร้างเพียงการสร้างขั้นตอนการผลิตขั้นต่ำขั้นสุดท้ายเท่านั้น คำแนะนำ ONBUILDอาจจะมีประโยชน์ที่นี่

มีเพียงคุณเท่านั้นที่รู้ว่าคุณกำลังพยายามทำอะไรและอะไรคือข้อ จำกัด ของคุณ ลิงค์ด้านบนสามารถใช้เป็นจุดเริ่มต้นและมีบทความอีกมากมายที่จะพบในเรื่อง


ขอบคุณสำหรับคำแนะนำ ฉันลงเอยด้วยการผสมผสานของสองวิธีที่คุณพูดถึง ในdocker-composeฉันจะตั้งค่าระดับเสียงเพื่อให้รหัสแพคเกจร่วมกันระหว่างภาชนะและโฮสต์ ONBUILDเมื่อรหัสแพคเกจจะมีความเสถียรผมสร้างขึ้นมาใหม่รุ่นถัดไปของภาพโดยใช้ แม้ว่าการทำสำเนาซ้ำจะเพิ่มขนาดของรูปภาพเนื่องจาก COPY ไม่ได้บ่อยเหมือนเมื่อก่อน แต่ฉันสามารถอยู่กับมันได้
Tejas Jayasheel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.