当我使用docker或docker与卷组合时,我经常会遇到权限问题,因为主机上不知道容器用户:
mkdir i-can-to-what-i-want
rmdir i-can-to-what-i-want
docker run -v$(pwd):/home -w/home ubuntu touch you-shall-not-delete-it
$ ls -al you-shall-not-delete-it
-rw-r--r-- 2 root root 0 2020-08-08 00:11 you-shall-not-delete-it
一个解决方案是始终这样做:
UID=$(id -u) GID=$(id -g) docker-compose up
或
UID=$(id -u) GID=$(id -g) docker run ...
但是。。。它很麻烦。。。
还有其他方法吗?
--user
将完成这项工作,除非这正是您试图避免的繁琐解决方案:
who
neo tty7 2020-08-08 04:46 (:0)
docker run --user $UID:$GID -v$(pwd):/home -w/home ubuntu touch you-shall-delete-it
ls -la
total 12
drwxr-xr-x 3 neo neo 4096 Aug 8 02:12 .
drwxr-xr-x 34 neo neo 4096 Aug 8 02:03 ..
drwxr-xr-x 2 neo neo 4096 Aug 8 02:03 i-can-to-what-i-want
-rw-r--r-- 1 neo neo 0 Aug 8 02:12 you-shall-delete-it
事实上,这里不使用音量:
docker run -v$(pwd):/home
你用捆绑土堆
使用绑定装载时,主机上的资源将装载到容器中
依赖主机的文件系统有优势(速度和动态数据源(,但也有局限性(文件所有权和可移植性(。
我如何看待事物:
1( 当您在dev中使用docker-compose,并且需要绑定不断更改的源代码时,绑定挂载是不可避免的,但您可以通过直接在compose中设置容器的用户/组来简化事情。
version: '3.5'
services:
app:
user: "${UID}:${GID}"
...
注意,${UID}
和${GID}
在这里是shell变量${UID}
是在bash
中定义的,但${GID}
不是。如果需要,您可以导出它,或者使用两者的用户id:user: "${UID}:${UID}"
。
2( 当你在一个框架中使用docker或docker compose时,你不需要在容器创建时从该主机提供文件/文件夹,但你可以在映像创建中提供,你更喜欢卷(名称卷(而不是绑定装载。