[Container] แก้ปัญหา docker image โต

จาก 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.