by Devin Yang

建立於: 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指令, ./console chowner 進行調整即可。
如果您是Linux的使用者,您可以輸入 id 查看,您的uid及gid是否為1000,
當如下圖都為1000時,您不需執行 ./console chowner 即可正常使用最新版本的d-laravel。

uid and gid

執行./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 幹了什麼事:
./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 down

因此確保我們下一次啟動時,不用再做一次上面的 ./console chowner 動作,
我們應該將 container 的變更 commit 成一個新的 image ,並且使用該image,
這樣下次啟動時才會保留最新的設定。
docker-compose.yml
如果不想調整 docker-compose.yml image 的名稱,我們可以直接把他 commit 成相同的名稱即可,例如: deviny/fpm:7.2.1 (請依您所用的 image 調整)。

關於php的fpm短的container id,可以用如下指令查詢
docker ps |grep php_1
例如:commint最新的設定到自己的image名稱:
commit


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

Tags: docker dlaravel

Devin Yang

文章內容無法一一說明,如果您有什麼不了解處,歡迎提問哦:)

No Comment

Post your comment

需要登入才可留言!

類似的文章


dlaravel

D-Laravel上的.env.example檔說明

本文說明關於D-Laravel上的.env設定 MYSQL_ROOT_PASSWORD=secret LARAVEL_INSTALLER='container' DOCKER_SERVICES='docker-compose.yml service/redis.yml'

laravel docker

關於D-Laravel的專案模式

如果您是新使用者,建議您改用我的最新環境phpenv。https://github.com/DevinY/phpenv

docker

ubuntu上安裝docker-compose

簡單介紹我如何在ubuntu上安裝docker-compose. 還滿容易的。