使用Docker Compose將一個Laravel應用程式容器化。它只是有2個服務。app(運行PHP8.0-FPM)和nginx。
docker-compose.yml:
version: "3"/span>
服務:
應用程式:
build:
args:
USER: novruz
context: ./
dockerfile: Dockerfile
圖片: blogger
container_name: blogger-app
重新啟動: 未停止
working_dir: /var/www/
卷軸:
- ./:/var/www/
網路:
- laravel
nginx:
image: nginx:alpine
container_name: blogger-nginx
重新啟動: unless-stopped
埠:
- 8000: 80
卷數:
- ./:/var/www/
- ./.docker/nginx/:/etc/nginx/conf.d/
networks:
- laravel
networks:
laravel:
driver: bridge
Dockerfile:
FROM php:8.0-fpm
ARG USER
RUN apt-get update && apt-get install -y --no-install-recommends
curl
git
zip
解壓
libpng-dev
libonig-dev
libxml2-dev
libzip-dev
&& apt-get clean
&& rm -rf /var/lib/apt/lists/*
運行docker-php-ext-install bcmath
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# 創建一個系統用戶來運行Composer和Artisan命令。
RUN useradd -G www-data,root -d /home/$USER $USER
RUN mkdir -p /home/$USER/.composer
&& chown -R $USER:$USER /home/$USER
WORKDIR /var/www
USER $USER
這些配置成功地構建(docker-compose build app)和運行(docker-compose up -d)了應用程式。
問題是
。但是當我在app服務容器中運行composer install --optimize-autoloader --no-dev時,它拋出了一個例外:
[RuntimeException]。
/var/www/vendor不存在,不能被創建。
這是一個權限問題,但我怎樣才能給在構建時創建的用戶novruz以正確的權限(并添加到組www-data)?
Debug
。這里是有趣的部分。在我的本地機器(MacBook Air M1 2020)上一切正常,但在Ubuntu 20.04(Focal Fossa)上卻不正常。
ls -l輸出在我的本地機器上:
-rw-r--1 www-data www-data 556 Sep 14 13:53 Dockerfile
-rw-r--r-- 1 www-data www-data 17 Sep 9 07:00 README.md
drwxr-xr-x 7 www-data www-data 224 Sep 7 14:33 app
-rwxr-xr-x 1 www-data www-data 1686 Sep 7 14:33 Artisan
drwxr-xr-x 4 www-data www-data 128 Sep 7 14:33 bootstrap
-rw-r--- 1 www-data www-data 1766 Sep 9 07:37 composer.json
-rw-r--r-- 1 www-data www-data 338242 Sep 9 07:37 composer.lock
drwxr-xr-x 17 www-data www-data 544 Sep 13 07:22 config
drwxr-xr-x 7 www-data www-data 224 Sep 13 06:45 database
-rw-r---1 www-data www-data 713 Sep 14 14:32 docker-compose.yml
-rw-r--r-- 1 www-data www-data 1319 Sep 9 07:04 phpunit.xml
drwxr-xr-x 7 www-data www-data 224 Sep 7 14:33 public
drwxr-xr-x 4 www-data www-data 128 Sep 9 07:07 resources
drwxr-xr-x 6 www-data www-data 192 Sep 10 05:52 routes
-rw-r-r-- 1 www-data www-data 563 Sep 7 14:33 server.php
drwxr-xr-x 5 www-data www-data 160 Sep 7 14:33 storage
drwxr-xr-x 7 www-data www-data 224 Sep 9 12:02 tests
如你所見,www-data是/var/www/目錄和其中檔案的所有者。我可以毫無問題地運行任何命令。
ls -l在Ubuntu 20.04的輸出:
-rw-rw-r-- 1 998 997 599 Sep 14 13:41 Dockerfile
-rw-rw-r- 1 998 997 17 Sep 14 10:16 README.md
drwxrwxr-x 7 998 997 4096 Sep 14 10:16 app
-rwxrwxr-x 1 998 997 1686 Sep 14 10:16 Artisan
drwxrwxr-x 3 998 997 4096 Sep 14 10:16 bootstrap
-rw-rw-r- 1 998 997 1766 Sep 14 10:16 composer.json
-rw-rw-r-- 1 998 997 338242 Sep 14 10:16 composer.lock
drwxrwxr-x 2 998 997 4096 Sep 14 10:16 config
drwxrwxr-x 5 998 997 4096 Sep 14 10:16 database
-rw-rw-r- 1 998 997 720 Sep 14 10:16 docker-compose.yml
-rw-rw-r-- 1 998 997 1319 Sep 14 10:16 phpunit.xml
drwxrwxr-x 2 998 997 4096 Sep 14 10:16 public
drwxrwxr-x 4 998 997 4096 Sep 14 10:16 resources
drwxrwxr-x 2 998 997 4096 Sep 14 10:16 routes
-rw-rw-r- 1 998 997 563 Sep 14 10:16 server.php
drwxrwxr-x 5 998 997 4096 Sep 14 10:16 storage
drwxrwxr-x 5 998 997 4096 Sep 14 10:16 tests
但是Ubuntu上的用戶是998,組是997。而且我一直得到一個運行時例外。為什么會發生這種情況呢?
uj5u.com熱心網友回復:
這里的問題是,容器內用戶的UID/GID與容器外用戶的UID/GID不一樣。
你可以通過三種方式來解決這個問題:
你可以通過三種方式來解決這個問題。
不要使用系結掛載。(這是指一個目錄同時掛載在主機和容器上。)問題是,主機和訪客在哪個用戶對應哪個UID上有分歧,所以如果你讓他們不共享檔案,這個問題就會消失。
代替使用系結掛載,你可以在Dockerfile中使用
COPY。COPY 。/var/www缺點是,當容器運行時,編輯容器的檔案是很有用的。
在容器內外匹配 UID/GID。與其在構建時創建用戶,不如在運行時覆寫 FPM 行程的 UID/GID。這可以在docker compose中像這樣完成。如何在Docker Compose中設定uid和gid?
使用用戶名稱空間來映射用戶。我從來沒有嘗試過這種方法,所以我真的不能給你任何指導,但這里是Docker檔案中關于如何做到這一點。https://docs.docker.com/engine/security/userns-remap/
另外,這里有一個關于使用用戶重映射與系結掛載的主題。https://forums.docker.com/t/permission-denied-when-using-userns-remap-and-writing-to-a-directory-mounted-from-the-host/48379/2
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/314096.html
標籤:
下一篇:請幫助我解決為什么我得到了錯誤?
