如何将docker容器的根目录挂载为NFS挂载点
How to mount the root directory of docker container as a NFS mount point
我是 docker 的新手,我正在尝试将 docker 容器的根目录挂载为 NFS 挂载点。
例如,我有一个 NFS 挂载点 test:/home/user/3243
,我正在尝试:
docker run -it -v "test:/home/user/3243":/ centos7 /bin/bash
绝对,失败了。所以我尝试了这个:
mount -t nfs test:/home/user/3243 /mnt/nfs/3243
docker run -it -v /mnt/nfs/3243:/ centos7 /bin/bash
又失败了,怎么办?能解决吗?
目前在 issue 4213.
中讨论(自 2014 年中)
Jeroen van Bemmel (jbemmel) 最近的一个解决方法是:
It appears that NFS functionality depends on the underlying storage driver ( aufs, devicemapper, etc. ), as well as the sharing of file handles between processes ( see blog post "docker: devicemapper
fix for “device or resource busy” (EBUSY
)") i.e. 'unshare' may have an impact on NFS mounts.
I've moved away from using the 'MOUNTPOINT=/vm/nfs
' as I am not sure if that event is even emitted.
Instead I created an upstart
file like this:
cat > /etc/init/ecdn.conf << EOF
description "eCDN container"
author "Jeroen van Bemmel"
# mounted MOUNTPOINT=/vm/nfs doesn't seem to work, at least not the first time
start on started docker and virtual-filesystems
stop on starting rc RUNLEVEL=[016]
respawn
script
exec /usr/bin/docker start -a ecdn
end script
pre-stop script
/usr/bin/docker stop ecdn
# dont /usr/bin/docker rm ecdn
end script
EOF
and then create the container like this:
script -c "docker create -it --name='ecdn' --volume /vm:/usr/share/nginx/html/vm:ro image/name"
这里有几个问题:
不能挂载到容器的根目录。所以 docker run -v /foo:/
永远行不通。
根据您第一次尝试的语法,-v test:/foo:bar
、Docker 会认为这是要创建一个名为 "test" 的 "named" 卷。
您应该能够先执行 NFS 装载,然后执行 docker run -v /mnt/nfs/3243:/foo
以将 nfs 路径装载到 /foo
。
但是同样,你不能挂载到 /
.
我是 docker 的新手,我正在尝试将 docker 容器的根目录挂载为 NFS 挂载点。
例如,我有一个 NFS 挂载点 test:/home/user/3243
,我正在尝试:
docker run -it -v "test:/home/user/3243":/ centos7 /bin/bash
绝对,失败了。所以我尝试了这个:
mount -t nfs test:/home/user/3243 /mnt/nfs/3243
docker run -it -v /mnt/nfs/3243:/ centos7 /bin/bash
又失败了,怎么办?能解决吗?
目前在 issue 4213.
中讨论(自 2014 年中)Jeroen van Bemmel (jbemmel) 最近的一个解决方法是:
It appears that NFS functionality depends on the underlying storage driver ( aufs, devicemapper, etc. ), as well as the sharing of file handles between processes ( see blog post "docker:
devicemapper
fix for “device or resource busy” (EBUSY
)") i.e. 'unshare' may have an impact on NFS mounts.I've moved away from using the '
MOUNTPOINT=/vm/nfs
' as I am not sure if that event is even emitted.
Instead I created anupstart
file like this:
cat > /etc/init/ecdn.conf << EOF
description "eCDN container"
author "Jeroen van Bemmel"
# mounted MOUNTPOINT=/vm/nfs doesn't seem to work, at least not the first time
start on started docker and virtual-filesystems
stop on starting rc RUNLEVEL=[016]
respawn
script
exec /usr/bin/docker start -a ecdn
end script
pre-stop script
/usr/bin/docker stop ecdn
# dont /usr/bin/docker rm ecdn
end script
EOF
and then create the container like this:
script -c "docker create -it --name='ecdn' --volume /vm:/usr/share/nginx/html/vm:ro image/name"
这里有几个问题:
不能挂载到容器的根目录。所以
docker run -v /foo:/
永远行不通。根据您第一次尝试的语法,
-v test:/foo:bar
、Docker 会认为这是要创建一个名为 "test" 的 "named" 卷。
您应该能够先执行 NFS 装载,然后执行 docker run -v /mnt/nfs/3243:/foo
以将 nfs 路径装载到 /foo
。
但是同样,你不能挂载到 /
.