จากความเดิมตอนที่แล้ว เราพาไป install odoo ด้วย docker กันไปแล้ว ซึ่งในการนำ custom module บางตัวมาใช้ หรือแม้กระทั่งพัฒนาขึ้นมาเอง เรามักจะเจอปัญหาที่ว่าไม่สามารถ install ได้สำเร็จ เนื่องจากขาด Library บางตัวไป
.
แล้วในเมื่อมันขาด library บางตัวไป แล้วเราจะต้องทำยังไงล่ะ ? ก็ install เข้าไปซะสิ ถ้าเป็นการ install แบบ build from source เราก็อาจจะไม่มีปัญหา เพราะ environment ทั้งหมด จะอยู่ภายในเครื่อง local ของเราเอง แต่.. ในเมื่อเรามาพยายามลดการมีปัญหาเรื่อง dependencies ด้วย docker กันไปแล้ว
. .
ทำไมเราจะยังต้องมา install environment ทุกอย่างที่จำเป็นในเครื่องเราเองอีกล่ะ ? หลาย ๆ คนอาจจะบอกว่า เราก็ exec เข้าไปใน container แล้วก็ install เอาซะสิก็จบแล้ว
.
ก็ไม่ผิดสักเท่าไร มันทำให้ container นั้น ๆ สามารถมี lib ที่เราต้องการได้
”ชั่วคราว” … ?
.
ยังไงนะ ??
เมื่อเราทำการ
docker compose downเมื่อไร ก็จะรู้เมื่อนั้น ทันทีที่เราdocker compose upขึ้นมาใหม่ container ของเรา จะกลับไปสู่สถานะ “ตั้งต้น” อีกครั้งนึง นั่นก็คือ เราจะกลับไปเป็นตอนที่ยังไม่มี library อยู่ใน container ซะอย่างนั้นไป.
การใช้
docker execทำการ shell เข้าไปเพื่อ install lib ที่ต้องการ อาจจะช่วยแก้ปัญหาเบื้องต้นได้. .
แต่ในระยะยาวที่เราต้องมีการ up/down หรือ restart docker กันอยู่บ่อย ๆ แล้วนั้น ทางที่ดีกว่า คือทำให้ images ของเรา มี library ที่ต้องการมาตั้งแต่ต้นกันเลย วันนี้ผมจะพาไปรู้จักกับ
Dockerfile
ใครหลายคนอาจจะเคยเห็นชื่อไฟล์นี้ผ่านตากันมาบ้าง ไฟล์นี้นี่แหละ ที่จะทำให้เราสามารถ Build container ที่มาพร้อมกับ lib ที่เราต้องการขึ้นมาได้
.
ในที่นี้ผมจะขอ Build on top จาก odoo 18.0 official ก็แล้วกัน โดยสิ่งที่เราต้องทำ
- สร้าง
Dockerfileและใส่ content ข้างในไปตามนี้FROM odoo:18.0 USER root RUN apt-get install nodejs RUN apt-get install npm RUN npm install -g less COPY ./config/odoo.conf /etc/odoo/ USER odoopart ที่อยากจะให้สนใจกันจะเป็นในส่วนนี้
RUN apt-get install nodejs RUN apt-get install npm RUN npm install -g lessเราจะเริ่ม syntax ด้วย
RUNหลังจากนั้นก็ สั่ง execute linux command ได้เลย ในส่วนนี้ผมทำการ install nodejs build เข้าไปใน image แล้วก็ install npm package เพิ่ม 1 ตัว.
- สั่ง Build Dockerfile ที่เราสร้างขึ้นมา
> docker build -t my_custom_odoo:18.0 .สิ่งที่คำสั่งนี้ทำคือ สั่ง build Dockerfile จาก current path สร้างเป็น image ใหม่ชื่อ
odootag :18.0.
- ตรวจสอบว่า build เรียบร้อยแล้วยังด้วยคำสั่ง
> docker imagesจะเจอ log หน้าตาประมาณนี้ขึ้นมา
REPOSITORY TAG IMAGE ID CREATED SIZE my_custom_odoo 18.0 xxxxxxxxxxxx 5 weeks ago 1.98GBถ้าเจอ log ที่เป็นชื่อ repo/tag ตรงตามที่เราสั่ง build ขึ้นมาก็เป็นอันว่าเสร็จสิ้น
- เรียกใช้ image ใหม่ใน
docker-compose.yml** อ้างอิงจาก yml file ใน day3version: "3.1" services: web: # image: odoo:18.0 # เปลี่ยนเป็นชื่อ image ใหม่ที่เพิ่งสร้างขึ้นมา image: my_custom_odoo:18.0 # command: -d database_name -u module_name depends_on: - db ports: - "8069:8069" volumes: - odoo-web-data:/var/lib/odoo - ./config:/etc/odoo - ./addons:/mnt/extra-addons db: image: postgres:15 environment: - POSTGRES_DB=postgres - POSTGRES_PASSWORD=odoo - POSTGRES_USER=odoo volumes: - odoo-db-data:/var/lib/postgresql/data ports: - 5432:5432/tcp volumes: odoo-db-data: odoo-web-data:
ทีนี้ถ้าเรารัน compose file และลองตรวจสอบดูอีกครั้ง ก็จะพบว่า library ที่ขาดไป ก็จะสามารถใช้งานได้เรียบร้อยแล้ว
Problem solved !!!
.
Side note: ** สำหรับใครที่อยากจะเอาไปใช้บน server หรือส่งไปรันในเครื่องอื่น ที่พอจะทำได้จะมีอยู่ 2 วิธี
1. ส่งไฟล์ Dockerfile ไป build ใหม่ที่เครื่องปลายทาง 2. เอาขึ้น Docker hub ซึ่ง ณ ปัจจุบัน สามารถทำเป็น private repo ได้ 1 repo สำหรับ free tier (update: 20250202)
ref: Dockerfile https://docs.docker.com/reference/dockerfile/
>_JV