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