Can';运行docker compose后,由于权限错误,无法编辑本地文件

Can';运行docker compose后,由于权限错误,无法编辑本地文件,docker,docker-compose,composer-php,file-permissions,Docker,Docker Compose,Composer Php,File Permissions,我运行docker compose up-d,然后用ssh连接到容器中。我可以通过localhost加载站点,但是当我尝试在本地上编辑源代码时,由于权限错误,它不允许我加载。这是容器与本地的ls-la输出: 容器: 本地: 我的dockerfile具有chown命令: 我的本地用户称为pwm。我尝试从主机运行chown-R pwm:pwm../app,此时我可以编辑文件,但随后我得到了laravel权限拒绝错误。然后我需要再次运行chown-R www-data:www-data../ap

我运行
docker compose up-d
,然后用ssh连接到容器中。我可以通过localhost加载站点,但是当我尝试在本地上编辑源代码时,由于权限错误,它不允许我加载。这是容器与本地的ls-la输出:

容器:

本地:

我的dockerfile具有chown命令:

我的本地用户称为pwm。我尝试从主机运行
chown-R pwm:pwm../app
,此时我可以编辑文件,但随后我得到了laravel权限拒绝错误。然后我需要再次运行
chown-R www-data:www-data../app
来修复它


如何修复此问题?

对于开发环境,我的解决方案是在容器内设置一个以root开头的入口点脚本,将容器内的用户更改为与卷装载的文件/目录所有者的用户相匹配(这将是主机上的用户),然后切换到该用户以运行应用程序。我有一个这样做的示例,以及在我的基本映像repo中您自己的容器中实现此功能所需的脚本:

在这里,fixperms脚本完成了繁重的工作,包括如下代码:

# update the uid
if [ -n "$opt_u" ]; then
  OLD_UID=$(getent passwd "${opt_u}" | cut -f3 -d:)
  NEW_UID=$(stat -c "%u" "$1")
  if [ "$OLD_UID" != "$NEW_UID" ]; then
    echo "Changing UID of $opt_u from $OLD_UID to $NEW_UID"
    usermod -u "$NEW_UID" -o "$opt_u"
    if [ -n "$opt_r" ]; then
      find / -xdev -user "$OLD_UID" -exec chown -h "$opt_u" {} \;
    fi
  fi
fi
该脚本在启动时作为root用户在容器中运行。我运行的入口点的最后一步将调用如下内容:

exec gosu ${app_user} "$@"
它以应用程序用户身份作为新的pid 1可执行文件运行容器命令