Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 无法在docker容器内创建目录。权限问题_Php_Symfony_Docker - Fatal编程技术网

Php 无法在docker容器内创建目录。权限问题

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中部署symfony应用程序。现在我在Linux服务器上的权限有问题。在我的本地Mac电脑上一切正常。 我有
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