Php 无法在docker容器内创建目录。权限问题
我正在尝试在docker中部署symfony应用程序。现在我在Linux服务器上的权限有问题。在我的本地Mac电脑上一切正常。 我有Php 无法在docker容器内创建目录。权限问题,php,symfony,docker,Php,Symfony,Docker,我正在尝试在docker中部署symfony应用程序。现在我在Linux服务器上的权限有问题。在我的本地Mac电脑上一切正常。 我有docker compose.yml文件: version: '3' volumes: . : services: db: image: mysql volumes: - "./.data/db:/var/lib/mysql" environment: MYSQL_ROOT_PASSWORD: ${DATAB
docker compose.yml
文件:
version: '3'
volumes:
. :
services:
db:
image: mysql
volumes:
- "./.data/db:/var/lib/mysql"
environment:
MYSQL_ROOT_PASSWORD: ${DATABASE_ROOT_PASS}
MYSQL_DATABASE: ${DATABASE_NAME}
MYSQL_USER: ${DATABASE_USER}
MYSQL_PASSWORD: ${DATABASE_PASS}
php:
build: ./docker/fpm
volumes:
- ./:/var/www/app
nginx:
build: ./docker/nginx
ports:
- ${APP_PORT}:8080
volumes:
- ./.logs/nginx/:/var/log/nginx
- ./:/var/www/app
和php
图像的Dockerfile:
FROM php:7.1-fpm-alpine
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN composer --version
RUN chown -R www-data:www-data /var/www
USER www-data
WORKDIR /var/www/app
因此,一切正常,但在我尝试运行docker compose exec php composer安装后,出现了错误:
/var/www/app/vendor不存在,无法创建。
为什么它只发生在linux服务器上
我正在从用户myapp
运行$docker compose up
UPD:
看起来chown
工作不正常:
$docker compose exec php ls-l/var/www/app
:
total 168
-rw-r--r-- 1 40007 40007 1662 Apr 19 08:44 Makefile
...
所有者不是www-data
UPD2:
我认为原因是,在我们从docker compose文件装载volume
之后,它从该卷中获取规则,因此chown
没有产生效果
这是一个原因。但这是一个多么漂亮的解决方案?容器内部和卷外部的用户ID在数字上是相同的(除非您的docker守护进程配置了用户名称空间),但很容易有不同的名称。如果要匹配主机上的用户,请使用数字ID。还应设置组
在Dockerfile生成中,RUN chown仅影响进入映像的文件,不影响运行时使用绑定装载添加的文件。绑定装载还将隐藏在构建时添加到容器映像中的文件
如果卷所有者因系统而异,则在Dockerfile中引入构建参数
ARG volumeOwnerGroup
USER $volumeOwnerGroup
使用以下命令进行生成:--build arg volumeOwnerGroup=$(stat-c'%u:%g'/var/www/app)
在docker compose文件中,您可以使用args
字典设置构建args。您可以从与docker compose.yml
相同目录中的.env
文件中提取该值。然后您只需确保.env
文件适合您的机器即可。另请参见。尝试以下操作
FROM php:7.1-fpm-alpine
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN composer --version
RUN mkdir -p /var/www/app \
&& chown -R www-data:www-data /var/www
USER www-data
WORKDIR /var/www/app
您的workdir是/var/app
,但您选择/var/www
。也许这就是问题所在?只是问题中的一个输入错误,我已经解决了。在执行RUN chown之前,您是否尝试过创建用户user www data
?无论如何,我看到您在构建阶段进行chown和用户创建,卷在启动/运行/部署服务阶段装载。@AlexGalera是的,我认为这就是原因。你知道一个好的解决方案吗?它没有帮助。实际上,该目录是存在的:docker compose exec php ls/var/www/app
显示所有应用程序目录在问题中查看upd上的OK可以运行docker compose exec id www-data
uid=82(www-data)gid=82(www-data)groups=82(www-data),82(www-data)
在dockerfile中尝试运行chown-R 82:82