boo*_*jum 2 docker docker-compose
这是一个最小的docker-compose.yml:
version: "3.6"
services:
foo:
user: "${UID}:${GID}"
image: node:latest
container_name: foo
working_dir: /var/www/foo
volumes:
- bar:/var/www/foo/bar
volumes:
bar:
Run Code Online (Sandbox Code Playgroud)
运行后,docker-compose up命名卷将在 处创建/var/lib/docker/volumes/project_bar,并且该project_bar目录的所有者为root- 这很好。虽然_data它里面的目录也属于root- 我希望它属于特定的非 root 用户。
例如:
docker-compose run --rm foo sh -c "mkdir bar/foo"
Run Code Online (Sandbox Code Playgroud)
将会失败mkdir: cannot create directory 'bar/foo': Permission denied。
我的印象是指定user: "${UID}:${GID}"(注意:uid/gid可用于docker,它们在 shell 中导出)可以解决此问题。显然,我错了。
有没有办法让/var/lib/docker/volumes/project_bar/_data特定用户拥有?如果可能的话,什么都不chown做。并且不涉及Dockerfile.
编辑:为了澄清,我希望/var/www/foo/bar容器及其等效项/var/lib/docker/volumes由特定用户而不是根用户拥有。
您要么涉及 Dockerfile,要么需要使用单独的进程设置卷。命名卷将使用映像的内容进行初始化,包括文件、目录、所有者和权限。当卷为空或不存在时会发生这种情况。
所以你的选择包括:
扩展第二个选项,您可以通过运行临时容器来执行任务来创建具有所需所有权和内容的卷:
docker container run --rm -v bar-data:/data busybox /bin/sh -c \
"touch /data/.initialized && chown -R ${UID}:${GID} /data"
Run Code Online (Sandbox Code Playgroud)
然后在您的撰写文件中,您可以将该卷声明为外部卷:
version: "3.6"
services:
foo:
user: "${UID}:${GID}"
image: node:latest
container_name: foo
working_dir: /var/www/foo
volumes:
- bar:/var/www/foo/bar
volumes:
bar:
# tell compose this volume is externally created with a different name
external: true
name: bar-data
Run Code Online (Sandbox Code Playgroud)
这将创建一个包含单个文件的卷,以防止 docker 从映像内容重新初始化空卷。这也意味着您需要在卷中加载所需的任何数据,否则卷将是空的。将数据复制到卷的常见方法是使用 tar:
tar -cC source_dir . | \
docker run --rm -i -v foo-data:/target busybox tar -xC /target
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1389 次 |
| 最近记录: |