Developer Logs

เมื่อเราขาด library บางตัวไป จะทำยังไงล่ะ ถ้าใช้ docker ?

odoo
Docker
Dockerfile

หลังจากที่เราพาไป install odoo ด้วย docker กันไปแล้ว เรามักจะเจอปัญหาที่ว่าไม่สามารถ install ได้สำเร็จ เนื่องจากขาด Library บางตัวไป ... ?

Days: 4 | Publish : 02/02/2025

setup odoo with docker and custom addons with built-in library to Dockerfile

จากความเดิมตอนที่แล้ว เราพาไป 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 ก็แล้วกัน
โดยสิ่งที่เราต้องทำ

  1. สร้าง 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 ตัว

.

  1. สั่ง Build Dockerfile ที่เราสร้างขึ้นมา

  > docker build -t my_custom_odoo:18.0 .

สิ่งที่คำสั่งนี้ทำคือ สั่ง build Dockerfile จาก current path
สร้างเป็น image ใหม่ชื่อ odoo
tag : 18.0

.

  1. ตรวจสอบว่า 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 ขึ้นมาก็เป็นอันว่าเสร็จสิ้น

  1. เรียกใช้ 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/