建立於: 6年前 ( 更新: 6年前 )
D-Laravel的fpm image在php 7.2.1以前是使用docker php官方的dockerfile重build的,
所以我可以指定了fpm的預設的owner是dlaravel,
--with-fpm-user=USER Set the user for php-fpm to run as. (default: nobody)
--with-fpm-group=GRP Set the group for php-fpm to run as.
不過新版的D-Laravel已改採官方build好的image(而不是官方的Image的dockerfile改寫後重build),
而官方預設的fpm執行使用者是www-data,這會造成D-Laravel在Linux的使用者在執行Laravel時出現,
無法寫入storage的情況,
因此,目前最新版的docker-compose-normal.yml及docker-ocmpose-random.yml預設已直接掛載www.conf囉,
方便大家依需求自行調整,安全考量,我們可以唯持www.conf的設定是www-data,
並且進入contianer中,將需要讓php程式可上傳或變更的資料夾owner都變更為www-data,
或是簡單點,讓fpm使用者為dlaravel即可正常執行Laravel在container上。
在Linux的環境中,如果您host端,執行container的使用者gid及uid不是1000,
我們可用D-Laravel的./console指令,
如果您是Linux的使用者,您可以輸入
當如下圖都為1000時,您不需執行
執行./console chowner,這樣可調整FPM所執行與container內的使用者及Host端的使用者uid是一致的。
說白了,讓fpm php有權限有權寫入檔案到我們建的laravel的project。
當然重點你的www.conf中執行的owner也需要設定為dlaravel。
https://github.com/DevinY/dlaravel/blob/master/etc/php-fpm.d/www.conf
直擊
1.檢測使用者的平台是否為Linux,是Linux才需進行。
2.取得目前使用者在Linux上的uid及gid。
3.透過 docker-compose 執行 container 內的命令,這裡的( exec php )指的是執行 container 所運行的 php service 。
也就是說在 php fpm 的 container 內執行了
他用來將container內的dlaravel使用者的uid及gid調整成與Host端使用者的uid及guid一致。
4.最後chowner,將container內的/home/dlaravel目錄,變更為新的使用者權限。
請記得,在 docker-compose 的環境,
container 會被移除, up 時,依image為樣版(唯讀)建立並執行 contaienr ,
也就是說每次的up都是一個全新的環境(image樣版是唯讀的)。
因此確保我們下一次啟動時,不用再做一次上面的
我們應該將 container 的變更 commit 成一個新的 image ,並且使用該image,
這樣下次啟動時才會保留最新的設定。
如果不想調整 docker-compose.yml 的 image 的名稱,我們可以直接把他 commit 成相同的名稱即可,例如: deviny/fpm:7.2.1 (請依您所用的 image 調整)。
關於php的fpm短的container id,可以用如下指令查詢
例如:commint最新的設定到自己的image名稱:
Docker在Linux環境上是使用Linux核心內建的命名空間及cgroup用來限制,控制與分離一個行程群組的資源(如CPU、記憶體、磁碟輸入輸出等),相較於MacOS(Unix環境),他透過HyperKit虛擬化技術來執行Docker,
在Linux環境上,使用核心原生的功能,效能可以快很多(一個是內建在核心的一個是HyperKit虛擬的),
這也是為何D-Laravel的使用者在MacOs上執行都很正常,在Linux上可能需要進行額外的權限設定調整的原因。
最後,關於本文中,我指的安全考量是,我們一般的user帳號是有bash的權限,以Linux的服務來說,
不會有shell,因為不需讓使用者登入shell,
所以www-data的服務,沒有shell的權限,相對來說是較安全的。
我們可以簡單的cat container內的etc/password來瞧瞧:
$
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
如果您在MacOS或Linux上執行D-Laravel碰到什麼困難,歡迎到D-Laravel的粉絲團留言哦,
我會盡可能幫您解決或解答的,如果您喜歡D-Laravel,請幫我在D-Laravel的repo壓個Star,謝謝您。
https://github.com/DevinY/dlaravel。
所以我可以指定了fpm的預設的owner是dlaravel,
--with-fpm-user=USER Set the user for php-fpm to run as. (default: nobody)
--with-fpm-group=GRP Set the group for php-fpm to run as.
不過新版的D-Laravel已改採官方build好的image(而不是官方的Image的dockerfile改寫後重build),
而官方預設的fpm執行使用者是www-data,這會造成D-Laravel在Linux的使用者在執行Laravel時出現,
無法寫入storage的情況,
因此,目前最新版的docker-compose-normal.yml及docker-ocmpose-random.yml預設已直接掛載www.conf囉,
方便大家依需求自行調整,安全考量,我們可以唯持www.conf的設定是www-data,
並且進入contianer中,將需要讓php程式可上傳或變更的資料夾owner都變更為www-data,
或是簡單點,讓fpm使用者為dlaravel即可正常執行Laravel在container上。
在Linux的環境中,如果您host端,執行container的使用者gid及uid不是1000,
我們可用D-Laravel的./console指令,
./console chowner
進行調整即可。如果您是Linux的使用者,您可以輸入
id
查看,您的uid及gid是否為1000,當如下圖都為1000時,您不需執行
./console chowner
即可正常使用最新版本的d-laravel。執行./console chowner,這樣可調整FPM所執行與container內的使用者及Host端的使用者uid是一致的。
說白了,讓fpm php有權限有權寫入檔案到我們建的laravel的project。
當然重點你的www.conf中執行的owner也需要設定為dlaravel。
https://github.com/DevinY/dlaravel/blob/master/etc/php-fpm.d/www.conf
直擊
./console chowner
幹了什麼事:1.檢測使用者的平台是否為Linux,是Linux才需進行。
2.取得目前使用者在Linux上的uid及gid。
3.透過 docker-compose 執行 container 內的命令,這裡的( exec php )指的是執行 container 所運行的 php service 。
也就是說在 php fpm 的 container 內執行了
usermod -u
及 groupmod -g
的命令,他用來將container內的dlaravel使用者的uid及gid調整成與Host端使用者的uid及guid一致。
4.最後chowner,將container內的/home/dlaravel目錄,變更為新的使用者權限。
請記得,在 docker-compose 的環境,
docker-compose down
時,container 會被移除, up 時,依image為樣版(唯讀)建立並執行 contaienr ,
也就是說每次的up都是一個全新的環境(image樣版是唯讀的)。
因此確保我們下一次啟動時,不用再做一次上面的
./console chowner
動作,我們應該將 container 的變更 commit 成一個新的 image ,並且使用該image,
這樣下次啟動時才會保留最新的設定。
如果不想調整 docker-compose.yml 的 image 的名稱,我們可以直接把他 commit 成相同的名稱即可,例如: deviny/fpm:7.2.1 (請依您所用的 image 調整)。
關於php的fpm短的container id,可以用如下指令查詢
docker ps |grep php_1
例如:commint最新的設定到自己的image名稱:
Docker在Linux環境上是使用Linux核心內建的命名空間及cgroup用來限制,控制與分離一個行程群組的資源(如CPU、記憶體、磁碟輸入輸出等),相較於MacOS(Unix環境),他透過HyperKit虛擬化技術來執行Docker,
在Linux環境上,使用核心原生的功能,效能可以快很多(一個是內建在核心的一個是HyperKit虛擬的),
這也是為何D-Laravel的使用者在MacOs上執行都很正常,在Linux上可能需要進行額外的權限設定調整的原因。
最後,關於本文中,我指的安全考量是,我們一般的user帳號是有bash的權限,以Linux的服務來說,
不會有shell,因為不需讓使用者登入shell,
所以www-data的服務,沒有shell的權限,相對來說是較安全的。
我們可以簡單的cat container內的etc/password來瞧瞧:
$
cat /etc/passwd|grep www
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
如果您在MacOS或Linux上執行D-Laravel碰到什麼困難,歡迎到D-Laravel的粉絲團留言哦,
我會盡可能幫您解決或解答的,如果您喜歡D-Laravel,請幫我在D-Laravel的repo壓個Star,謝謝您。
https://github.com/DevinY/dlaravel。
No Comment
Post your comment