ให้ Docker PHP5.6 ใน CentOS9 รันด้วยสิทธิ์ของ root และกำหนดสิทธิ์ไฟล์


ใช้ flag --privileged (ไม่แนะนำถ้าไม่จำเป็น)

เพื่อให้ container มีสิทธิ์ระดับสูงสุด เหมือน root แบบเต็ม

docker run -d \
  --name php56-fpm \
  -p 9006:9000 \
  -v /var/www/html/old-chaiyakul.com:/var/www/html/old-chaiyakul.com \
  -v /opt/php56/php.ini:/usr/local/etc/php/php.ini \
  --privileged \
  --restart unless-stopped \
  php:5.6-fpm

ถ้าใช้ --privileged แล้วใน CMS ยังขึ้นว่า Directory Permissions เป็น Unwritable แปลว่า:

  • ตัว container รันด้วยสิทธิ์สูงแล้ว
  • แต่ปัญหาอยู่ที่ permission หรือ ownership ของไฟล์/โฟลเดอร์ที่แมปเข้ามา ไม่ถูกต้อง (บน host)

สาเหตุหลัก ๆ ที่ cms แจ้งว่า Unwritable

  1. Owner/Group ของไฟล์ไม่ตรงกับ user ใน container
    cms ใน container มักรันด้วย user เช่น www-data (UID 33)
    แต่ folder บน host อาจเป็นเจ้าของโดย user อื่น (เช่น root หรือ user ปกติ) ทำให้ PHP-FPM เขียนไม่ได้
  2. Permission ของไฟล์/โฟลเดอร์ไม่อนุญาตให้เขียน

วิธีแก้ไข

วิธีดู user ของโปรเซส php-fpm

1.เข้า container

docker exec -it php56-fpm bash

2.ดู user ปัจจุบันที่อยู่ใน shell (น่าจะ root อยู่แล้ว)

whoami

3.ลองตรวจสอบไฟล์โปรเซส php-fpm (ถ้ามี) ด้วย ls -l ดู owner

ls -l /usr/local/sbin/php-fpm

4.ลองดูไฟล์ config ของ php-fpm ว่ากำหนด user ไว้ที่ไหน

cat /usr/local/etc/php-fpm.d/www.conf | grep '^user\|^group'

หรือ

cat /usr/local/etc/php-fpm.conf | grep '^user\|^group'

โดยปกติ php-fpm มักจะรันด้วย user เช่น www-data หรือ php-fpm

ตัวอย่าง

root@7dc62a95d4b7:/var/www/html# cat /usr/local/etc/php-fpm.d/www.conf | grep '^user\|^group'
user = www-data
group = www-data

ถ้าอยากเช็ค UID ของ user ที่ php-fpm รัน

พอรู้ชื่อ user จาก config แล้ว ลอง

id www-data

เช่น

root@7dc62a95d4b7:/var/www/html# id www-data
uid=33(www-data) gid=33(www-data) groups=33(www-data)

ตัวอย่างการแก้ไขสิทธิ์ในเครื่องให้ตรงกับ Docker

ถ้า config php-fpm บอกว่า

user = www-data
group = www-data

ก็ให้ chown โฟลเดอร์ใน host ให้เป็น

sudo chown -R 33:33 /var/www/html/old-chaiyakul.com

(เพราะ www-data มี UID=33)

กลับไปที่ host เครื่องหลัก (เครื่องที่ลง Docker)

ตั้ง permission ของโฟลเดอร์ CMS ให้ตรงกับ UID:GID นั้น

sudo chown -R 33:33 /var/www/html/old-chaiyakul.com
sudo chmod -R 755 /var/www/html/old-chaiyakul.com

รีสตาร์ท container

docker restart php56-fpm

,