จาก Blog ตอนก่อนที่มีความสงสัยว่าทำไมขนาด Image ของ Container มันโต จึงได้ลองด้วย Podman history เพื่อตรวจสอบไป //ปล. docker history ก็ใช้งานได้นะ
แล้วที่นี่มาเจอคำสั่งที่ทำให้ Layer มันเพิ่มขึ้นแบบงงๆ ตามรูปครับ
มันเกิดอะไรขึ้น ?
- ตัว dockerfile ของ Container ทำผิด best practice เดี๋ยวจะมีอีก Blog แยกมาครับ เลยทำให้ขนาดของ image มันใหญ่เกินความเป็นจริงครับ
- ตัว dockerfile มีโครงประมาณนี้ครับ ย้ายมาจาก AIX นะ หลายคนอาจจะสงสัยทำไมเอา db2 client ยัดลงไป 5555
FROM rockylinux:8.5 #Gateway ENV GW_PROP="/etc/gwconfig/" RUN mkdir /etc/gateway/ RUN mkdir /etc/gwconfig/ ADD gateway-ws/target/wmsl-gateway-web-app.war /etc/gateway/ WORKDIR /etc/gateway CMD java -jar ds-gateway-web-app.war --spring.profiles.active=production,gateway,native --spring.config.location=$GW_PROP ##Groups and Users ### 1. Groups RUN groupadd -r -g 10001 invsopgp RUN groupadd -r -g 10002 invsspgp ### 2. Groups RUN useradd -m -d /home/invsbch -u 1001 -g invsopgp -G invsopgp invsbch RUN useradd -m -d /home/invsoper -u 1002 -g invsopgp -G invsspgp,invsopgp invsoper ## 1. Packages ### - SHELL RUN yum install -y ksh-20120801 ### - Package for db2 RUN yum install -y binutils-2.30 kernel-devel-4.18.0 patch-2.7.6 libaio-0.3.112 numactl-2.0.12 ### - JAVA RUN yum install -y java-17-openjdk java-17-openjdk-devel ## 2. Install DB2 Client ENV TEMP_BNZ="/tmp/bananza_tmp" ENV HOME_INVSBCH="/home/invsbch" ENV HOME_INVSOPER="/home/invsoper" RUN mkdir $TEMP_BNZ COPY repo_appserver/v11.5.4_linuxx64_rtcl.tar.gz $TEMP_BNZ RUN tar xvzf $TEMP_BNZ/v11.5.4_linuxx64_rtcl.tar.gz -C $TEMP_BNZ \ && su - invsbch -c "$TEMP_BNZ/rtcl/db2_install -y" \ && echo '. $HOME_INVSBCH/sqllib/db2profile' >> $HOME_INVSOPER/.bash_profile \ && rm -rf $TEMP_BNZ \ && su - invsbch -c "cd $HOME_INVSBCH/sqllib/bin && db2set DB2CODEPAGE=874" COPY repo_appserver/create_catalogdb2.sh $HOME_INVSBCH RUN chown invsbch:invsopgp $HOME_INVSBCH/create_catalogdb2.sh ## 3. Copy program COPY repo_appserver/ds-server-script/bananna /usr/bananna ### - Operation COPY repo_appserver/XmlConfig/config-undb.xml /usr/bananna/operation/ COPY repo_appserver/XmlConfig/config-db.xml /usr/bananna/operation/ COPY gateway-invx/gateway-invx-script-operation/target/Operation.jar /usr/bonanza/operation/ COPY gateway-invx/gateway-invx-investment-script-ftpconfig/target/FTPConfig.jar /usr/bananna/operation/ RUN echo 'ksh /usr/bananna/operation/menuoper.sh' >> $HOME_INVSOPER/.bash_profile ### - Config COPY gateway-invx/gateway-invx-script-configproperties/target/ConfigProperties.jar /usr/bananna/email/script/ ### - Send mail COPY gateway-invx/gateway-invx-script-decrypt/target/DecryptString.jar /usr/bananna/email/script/ COPY gateway-invx/gateway-invx-script-adhocmail/target/AdhocMail.jar /usr/bananna/email/script/ ##4. Permission RUN chown -R invsbch:invsspgp /usr/bananna RUN chmod -R 750 /usr/bananna RUN chown -R invsbch:invsopgp /usr/bananna/archive/script RUN chmod -R 750 /usr/bananna/archive/script RUN chown -R invsbch:invsopgp /usr/bananna/archive/data RUN chmod -R 770 /usr/bananna/archive/data RUN chown -R invsbch:invsopgp /usr/bananna/install RUN chmod -R 700 /usr/bananna/install RUN chown -R invsbch:invsopgp /usr/bananna/housekeeping RUN chmod -R 750 /usr/bananna/housekeeping RUN chown -R invsbch:invsopgp /usr/bananna/operation RUN chmod -R 750 /usr/bananna/operation RUN chown -R invsbch:invsopgp /usr/bananna/email/script RUN chmod -R 750 /usr/bananna/email/script RUN chown -R invsbch:invsspgp /usr/bananna/email/log RUN chmod -R 750 /usr/bananna/email/log RUN chown -R invsbch:invsopgp /usr/bananna/interface/script RUN chmod -R 770 /usr/bananna/interface/script RUN chown -R invsbch:invsspgp /usr/bananna/interface/log RUN chmod -R 770 /usr/bananna/interface/log RUN chown -R invsbch:invsopgp /usr/bananna/interface/temp RUN chmod -R 770 /usr/bananna/interface/temp ##5 .bashrc RUN echo '#Exec container to home directory' >> $HOME_INVSBCH/.bashrc \ && echo 'if [ $PWD != $HOME ]; then' >> $HOME_INVSBCH/.bashrc \ && echo ' echo "Welcome $(whoami)"' >> $HOME_INVSBCH/.bashrc \ && echo ' cd $HOME' >> $HOME_INVSBCH/.bashrc \ && echo 'fi' >> $HOME_INVSBCH/.bashrc RUN echo '#Exec container to home directory' >> $HOME_INVSOPER/.bashrc \ && echo 'if [ $PWD != $HOME ]; then' >> $HOME_INVSOPER/.bashrc \ && echo ' echo "Welcome $(whoami)"' >> $HOME_INVSOPER/.bashrc \ && echo ' cd $HOME' >> $HOME_INVSOPER/.bashrc \ && echo 'fi' >> $HOME_INVSOPER/.bashrc RUN chown -R invsbch:invsopgp /etc/gateway/ && chown -R invsbch:invsopgp $GW_PROP USER invsbch
รีดไขมัน
- ปัญหาที่ 1: คำสั่ง chown / chown มีเนื้อที่เพิ่มมาแบบงงๆ
- จากรูป Error ที่เห็นว่าคำสั่ง chown / chown มีเนื้อที่เพิ่มมาแบบงงๆ จาก Script ใสส่วน 4. Permission พบว่ามันผิด Practice ของ docker เพราะคำสั่งกลุ่ม ADD / RUN / COPY พวกนี้ Run 1 รอบ มันจะสร้าง Layer ใหม่ ที่มีขนาดเท่ากับ File ที่ได้รับผลกระทบจากคำสั่งกลุ่ม ADD / RUN / COPY
- ทางแก้ได้ รวบคำสั่ง จากเดิม RUN 22 รอบให้เหลือ 1 batch พอ เพื่อลดจำนวน Layer จาก 22 Layer ให้เหลือ 1 Layer เท่านั้น
- ปัญหาที่ 2: คำสั่ง yum install มีเนื้อที่เพิ่มมาแบบงงๆ
- สาเหตุ คล้ายๆกับปัญหาที่ 1 เลยครับ
- ดังนั้นทางแก้ เหมือนกันครับ รวบคำสั่ง yum install ให้เหลือ 1 รอบ
และเพิ่มการเรียกใช้คำสั่งyum clean all
เพื่อล้างพื้นที่คืน
RUN yum install -y ksh-20120801 ncurses-6.1 binutils-2.30 kernel-devel-4.18.0 patch-2.7.6 libaio-0.3.112 numactl-2.0.12 java-17-openjdk java-17-openjdk-devel; yum clean all
จากที่แก้ปัญหาที่ 1 และ 2 แล้วลอง build image ใหม่อีกรอบ มาตรวจขนาดกันครับ
ลดลงแล้วครับ ^___^ 3.15 GB เหลือ 2.32 GB หลายไป 800 MB ครับ
Discover more from naiwaen@DebuggingSoft
Subscribe to get the latest posts sent to your email.