我是 Docker 的新手,我想用它来为我的代码获得一个受控的编译环境。
我已经有了一个包含我需要的所有工具的 Docker 镜像。我目前的问题如下:
这是我首先尝试的(将源文件夹作为卷运行容器)和我得到的错误:
[mbrandalero@machine ~]$ docker run -it --cap-add sys_admin -v "/homes/mbrandalero/src:/usr/local/src/" mbrandalero/my-image bash
/usr/bin/docker-current: Error response from daemon: error while creating mount source path '/homes/mbrandalero/src': mkdir /homes/mbrandalero/src: permission denied.
Run Code Online (Sandbox Code Playgroud)
(显然它正在尝试在主机端创建目录,但它已经存在)
奇怪的是,当我尝试将整个主文件夹作为卷运行容器时,它可以工作但会产生不同的错误(文件夹中没有写权限):
[mbrandalero@machine ~]$ docker run -it --cap-add sys_admin -v "/homes/mbrandalero/:/usr/local/src/home" mbrandalero/my_image bash
root@46712ad936f2:/usr/local/src# cd home/
bash: cd: home/: Permission denied
root@46712ad936f2:/usr/local/src# ls -lah | grep "\(\.\|home\)"
total 4.0K
drwxr-xr-x 1 root root 18 May 20 14:50 .
drwxr-xr-x 1 root root 17 May 15 14:06 ..
drwxr-x--- 30 10031 10031 4.0K May 20 15:03 home
Run Code Online (Sandbox Code Playgroud)
我做得对吗?我错过了什么?
附加信息:
更新(1):
显然在运行时设置用户 ID 可以docker run解决问题,但这是正确的做法吗?以这种方式运行它有点固定的东西,但看起来很奇怪(我得到“我没有名字!”作为用户名):
[mbrandalero@machine ~]$ docker run -it --cap-add sys_admin -v "/homes/mbrandalero/:/usr/local/src/home" --user $(id -u) mbrandalero/my_image bash
I have no name!@2efec822e572:/usr/local/src$ cd home/
I have no name!@2efec822e572:/usr/local/src/home$
Run Code Online (Sandbox Code Playgroud)
正如您在更新中所指出的,文件上的 UID 未映射到绑定安装中,这就是 Linux 绑定安装的方式。您可以使用不同的 UID 启动容器,但这会导致容器内的 /etc/passwd 映射到不同的用户,甚至没有(在您的情况下)用户。有多种选项,但我的偏好是使用 usermod 命令修改容器的 UID,该命令在我的fix-perms 脚本的图像入口点内运行。这需要以 root 身份运行,但您可以gosu在运行命令时使用回退到用户。我在我的dockercon 演讲中谈到了这个。
请注意,除了绑定挂载到主机 NFS 目录之外,您还可以直接在 NFS 服务器上进行卷挂载。以下是如何执行此操作的几个示例:
# create a reusable volume
$ docker volume create --driver local \
--opt type=nfs \
--opt o=nfsvers=4,addr=nfs.example.com,rw \
--opt device=:/path/to/dir \
foo
# or from the docker run command
$ docker run -it --rm \
--mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,\"volume-opt=o=nfsvers=4,addr=nfs.example.com\",volume-opt=device=:/host/path \
foo
# or to create a service
$ docker service create \
--mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,\"volume-opt=o=nfsvers=4,addr=nfs.example.com\",volume-opt=device=:/host/path \
foo
# inside a docker-compose file
...
volumes:
nfs-data:
driver: local
driver_opts:
type: nfs
o: nfsvers=4,addr=nfs.example.com,rw
device: ":/path/to/dir"
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6307 次 |
| 最近记录: |