为了在不改变宿主系统的拥有者/权限的情况下实现所需的行为,请按照以下步骤进行操作:
在您的宿主系统上执行id
命令,获取所需用户和/或组的ID。此命令将显示当前用户的UID和GID以及用户所在的所有组的所有ID。
$ id
将定义添加到您的docker-compose.yml文件中
user: "${UID}:${GID}"
那么您的文件可能看起来像这样
php:
user: "${UID}:${GID}"
image: php:7.3-fpm-alpine
设置您的.env
文件中的值
UID=1000
GID=1001
3a. 或者你可以通过以下方式扩展你的~/.bashrc
文件:
export UID GID
为了全局定义而不是在每个项目的.env文件中定义它。
如果这对你不起作用(比如在我的当前发行版上,GID没有被设置),请使用以下两行:
export UID=$(id -u)
export GID=$(id -g)
感谢 @SteenSchütt 提供的全局定义UID / GID的简单解决方案。
现在,在容器中,您的用户的ID为1000,组为1001,并且您可以为每个环境设置不同的值。
注意: 请使用您在主机系统上找到的用户/组ID替换我使用的ID。由于我无法知道您的系统使用哪些ID,因此我提供了一些示例组和用户ID。
如果您不使用docker-compose或想要了解更多实现此目的的不同方法,请阅读我的信息来源:https://dev.to/acro5piano/specifying-user-and-group-in-docker-i2e
如果您的卷挂载文件夹在计算机上不存在,Docker会创建它(使用root用户),因此请确保它已经存在并且由您想要使用的用户ID/组ID拥有所有权。
我添加了一个dokuwiki容器的示例以更好地解释它:
version: '3.5'
services:
dokuwiki:
user: "${UID}"
image: bitnami/dokuwiki:latest
ports:
- '8080:8080'
volumes:
- '/home/manuel/docker/dokuwiki/data:/bitnami/dokuwiki/'
restart: unless-stopped
expose:
- "8080"
如果dokuwiki容器没有对主机目录/home/manuel/docker/dokuwiki/data
的写访问权限,它将无法正确初始化。
如果在启动时该目录不存在,Docker将为我们创建它,但它将具有root:root作为用户和组。因此,容器启动将失败。
如果在启动容器之前我们创建了这个文件夹
mkdir -P /home/manuel/docker/dokuwiki/data
然后检查一下
ls -nla /home/manuel/docker/dokuwiki/data| grep ' \.$'
检查文件夹的uid和gid,并确保它们与我们在步骤3中放入.env文件中的相匹配。