จากความเดิมตอนที่แล้ว เราพาไป 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 ใน day3
version: "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/