使用与父用户相同的UID/GID运行docker或docker compose的简单方法



当我使用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时,你不需要在容器创建时从该主机提供文件/文件夹,但你可以在映像创建中提供,你更喜欢卷(名称卷(而不是绑定装载。

最新更新