如何克服Docker使用符号链接的限制?

时间:2019-05-19 21:31:14

标签: docker dockerfile

我有多组文件要包含为数据 用于Web服务器。其中一些是静态的 资产来支持静态网站。

假设恰好有两个网站的静态资产, 包含为Web服务器的数据。每套资产 放在自己的文件夹中,也可能位于源代码中(例如git) 资料库。这些位于:

/path/to/site1/public

/other/path/to/site2/public

实际上可能有几套这样的静态 资产位于以下子目录的不同子目录中 文件系统中各个位置的文件夹。

我需要将它们安装到Docker映像中, 例如/var/www/http/site1/var/www/http/site2, 等等。

有一个好的绕过方法将非常有用 Docker在不使用符号链接的情况下的限制 必须将这些数据集发布到某处的Web服务器上 并在Dockerfiles中引用它们的URL。

2 个答案:

答案 0 :(得分:0)

此模式很灵活,对我来说效果很好。 在此示例中,当前目录是父目录 其中一个包含静态资产, 在名为“ public”的文件夹中。

在此文件夹中,如下所示的shell脚本:

#!/bin/bash

# Build a Docker image "site1-assets" with the static files.
docker build -f - --tag=site1-assets . <<EOF
FROM scratch
COPY public ./
EOF

对site2等的静态资产执行类似的操作。 每组文件都位于何处, 只要它们都在同一台机器上。

然后在需要资产,行的任何Dockerfile中 像这样:

FROM site1-assets as site1
COPY / /

FROM site2-assets as site2
COPY / /

# and so on.

# And now the step that uses the external files.
FROM alpine

# Some config lines here ...

# Copy in files in image "site1".
COPY from=site1 / /var/www/http/site1/
# Copy in files in image "site2".
COPY from=site2 / /var/www/http/site2/

# More config lines if needed.

CMD run-my-app args

如果外部图像变化很少,您可能希望 将文件复制到客户端的开头附近 Dockerfile。如果它们经常变化,可能是 最好把它们放到最后。这个想法是 利用Docker的缓存功能 用于将来构建的部分图像。

核心思想与选项基本相同 https://stackoverflow.com/a/39382248/5022006中的“共享基本图片”, 但比此处描述的方案更灵活。

答案 1 :(得分:0)

符号链接在Docker容器中可以正常工作。将符号链接放置在Docker映像和容器中的限制是仅复制链接,而不复制其指向的文件。同样,在容器内部,符号链接是相对于映像/容器文件系统内部的文件和目录的。因此,要在容器内部使用符号链接,需要使它们相对于容器内部也将存在的目录结构相对。例如。如果您具有以下条件:

path1/projA/link-good -> ../projB/file
path1/projA/link-bad1 -> /host/path1/projB/file
path1/projA/link-bad2 -> ../../path2/projC/file
path1/projA/link-bad3 -> ../projD/file
path1/projB/file
path2/projC/file
path1/projD/file

然后您将这些包含在Dockerfile中,

COPY path1/projA/ /image/projA/
COPY path1/projB/ /image/projB/
COPY path2/projC/ /image/projC/

link-good链接有效。其他链接存在以下问题:

  • link-bad1指向主机上仅存在的路径,请使用相对路径。
  • link-bad2指向图像中不存在的相对路径,因为您将目录添加为/image/proj*,因此图像文件系统中没有path2
  • link-bad3指向图像中从未包含的文件,COPY命令不跟随链接。