my-package
ฉันสร้างแพคเกจหลามที่เรียกว่า ฉันไม่มีความตั้งใจที่จะเผยแพร่สู่สาธารณะดังนั้นการติดตั้งส่วนใหญ่ผ่านเซิร์ฟเวอร์ภายในของเรา เมื่อเร็ว ๆ นี้นักพัฒนาอาวุโสคนหนึ่งได้สร้างสถาปัตยกรรมโดยใช้นักเทียบท่าที่โฮสต์แอปพลิเคชันและmy-package
เป็นที่พึ่ง
ปัญหาคือเพื่อทดสอบแพคเกจฉันต้องทำซ้ำคัดลอกรหัสของฉันลงในอิมเมจ docker จากนั้นถอนการติดตั้งแพคเกจเวอร์ชันเก่าและติดตั้งใหม่จากรหัสท้องถิ่น
- การสร้างรูปภาพใหม่ทั้งหมดอีกครั้งใช้เวลาครึ่งชั่วโมง - ไม่ใช่ตัวเลือก
- สร้าง 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
- ขนาดภาพใหญ่ขึ้นทุกครั้งที่ฉันสร้างภาพใหม่
- เล่มเป็นตัวเลือกที่ฉันยังไม่ได้ลอง ฉันใช้ประโยชน์จาก
script/shell.sh
สิ่งที่มี$@
อยู่แล้ว ฉันตั้งค่าเป็นจุดเริ่มต้นและเรียกใช้คำสั่งใด ๆ ที่ฉันต้องการเรียกใช้ภายในรูปภาพโดยไม่มีการต่อรองมาก - ฉันใช้นักเทียบท่าเขียนดังนั้นทุกครั้งที่ฉันสร้างใหม่ด้วยแท็กใหม่ฉันต้องอัปเดตในนักเขียนที่ดีเช่นกัน เมื่อเวลาผ่านไปมันน่ารำคาญที่จะทำเช่นนี้สำหรับการเปลี่ยนแปลงบรรทัดเดียวในรหัส
-v /path/on/host:/path/in/container
?