在docker容器中装入带有符号链接的主机目录

lap*_*ira 72 docker

我用这个参数挂载了容器:

-v/home/test /:/ home/test

在主机内部/ home/test中有一个指向/ mnt /文件夹的符号链接.

但是这个链接,虽然可以看到指向的位置,但似乎在容器内部被破坏了:

root@f93f72b45013:/var/www/html# cd /home/test/ 
root@f93f72b45013:/home/test# ls -lrt 
total 11956 
lrwxrwxrwx. 1 root root 40 Jul 20 15:55 file -> /mnt/mountedfile/
root@f93f72b45013:/home/test# ls -lrt file/*
ls: cannot access file/*: No such file or directory
Run Code Online (Sandbox Code Playgroud)

这甚至可以在码头工作中完成吗?我不确定是否有办法做到这一点.

我知道我可以直接挂载符号链接指向的位置,但我只是想知道这是否可能.

Kem*_*hou 105

符号链接是docker内部的一大挑战.在您的情况下,您可以安装两个导演

-v /home/test/:/home/test -v /mnt/mountedfile:/mnt/mountedfile
Run Code Online (Sandbox Code Playgroud)

要使容器内部和外部工作的符号链接必须是绝对路径并使用完全相同的名称.

通常,符号链接在docker中不起作用.我发现这很难.

  • @Eitan 当你想使用 docker 时离开 Windows 并拥抱 linux/unix 系统 (2认同)

小智 11

一种解决方案是使Docker挂载原始文件,但使用readlink -f打印文件的实际位置.这样,您仍然可以在命令中引用符号链接位置,例如

docker run -it -v $(readlink -f /home/test/):/home/test/ ...

  • 我还没有在 Docker 中测试过它,但是通过使用 readlink,看来这对 /home/test/ **is** 是一个符号链接有效,但如果 /home/test/ **包含** a 则无效符号链接。 (9认同)

小智 10

您好,感谢您的帮助就我而言,我正在努力在我的 Angular nginx 应用程序上激活 https

docker run -p 80:80 -p 443:443 \
   --name test \
   -v /etc/letsencrypt/live/exemple.com:/etc/nginx/certs \
   -v /home/admin/nginx-default.conf:/etc/nginx/conf.d/default.conf:ro test
Run Code Online (Sandbox Code Playgroud)

不在 docker 内挂载链接 cert.pem 和 privkey.pem

但是如果我像这样明确使用所有文件路径

docker run -p 80:80 -p 443:443 \
   --name test \
   -v /etc/letsencrypt/live/example.com/cert.pem:/etc/nginx/certs/cert.pem \
   -v /etc/letsencrypt/live/example.com/privkey.pem:/etc/nginx/certs/privkey.pem \
   -v /home/admin/nginx-default.conf:/etc/nginx/conf.d/default.conf:ro test
Run Code Online (Sandbox Code Playgroud)

一切正常,我想你可以用 docker-compose 做同样的事情


Paw*_*och 6

这是可行的,但你必须“考虑容器”,如果你在随机位置有指向随机文件的符号链接,那么它实际上可能不值得。

但考虑一下这个可行的场景:

您有 2 个文件夹,其中一个包含真实文件,另一个包含真实文件的符号链接:

/static-data/
|_ data-file1.dat
|_ data-file2.dat
|
|__index/
   |_a.txt
   |_b.txt

/other/
|_ data-file1.dat -> /static-data/data-file1.dat 
|_ data-file2.dat -> /static-data/data-file2.dat 
|
|__index/
   |_a.txt
   |_b.txt
Run Code Online (Sandbox Code Playgroud)

现在如果你安装/other:/data

对于容器,当您ls -lah /data会看到损坏的链接,因为/static-data容器中不存在。解决方案是在主机中创建断开的链接,假设/other对于断开的主机并不直接重要,因此您的新结构将是:

/other/
|_ data-file1.dat -> /mirror/data-file1.dat 
|_ data-file2.dat -> /mirror/data-file2.dat 
|
|__index/
   |_a.txt
   |_b.txt
Run Code Online (Sandbox Code Playgroud)

然后你需要2条挂载记录

/other:/data
/static-data:/mirror
Run Code Online (Sandbox Code Playgroud)

现在,当您运行容器时,主机损坏的符号链接在容器中不会损坏,因此/data/data-file1.dat -> /mirror/data-file1.dat容器已安装/mirror,因此符号链接指向/static-data/data-file1.dat主机

如果您不希望主机中的符号链接损坏,那么您可以将两个目录安装为

/other:/data
/static-data:/static-data
Run Code Online (Sandbox Code Playgroud)

现在链接可以在主机和容器中有效。正如您所看到的,这是可能的,我测试了它并且它有效,但它只对明显的文件集群有价值。如果都是随机的,您最终会安装很多目录或单个文件,以反映容器中的主机结构