จากความเดิมตอนที่แล้ว เราพาไป 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 odoo
part ที่อยากจะให้สนใจกันจะเป็นในส่วนนี้
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 ใหม่ชื่อ
odoo
tag :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
