我怎样才能绕过Docker&x27;s对符号链接使用的限制?

我怎样才能绕过Docker&x27;s对符号链接使用的限制?,docker,dockerfile,Docker,Dockerfile,我有多组文件要包含为数据 对于web服务器。其中一些集合是静态的 支持静态网站的资产 假设有两个网站的静态资产, 作为web服务器的数据包含。每套资产 放在自己的文件夹中,可能在源代码中(例如git) 存储库。它们位于: /path/to/site1/public 及 事实上,可能会有几组这样的静电场 位于的不同子目录中的资产 文件系统中不同位置的文件夹 我需要将它们安装到Docker映像中, 例如,/var/www/http/site1和/var/www/http/site2, 等等 如果有

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

假设有两个网站的静态资产, 作为web服务器的数据包含。每套资产 放在自己的文件夹中,可能在源代码中(例如git) 存储库。它们位于:

/path/to/site1/public

事实上,可能会有几组这样的静电场 位于的不同子目录中的资产 文件系统中不同位置的文件夹

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

如果有一个好办法绕过它,那将是非常有用的 Docker对使用无符号链接的符号链接的限制 必须将这些数据集发布到某个web服务器上
并在Dockerfiles中引用他们的URL。

这种模式很灵活,对我来说效果很好。 本例中的当前目录是父目录 包含静态资产的资产的 在名为“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
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的缓存能力 部分映像供将来的构建使用

核心理念与选项基本相同 “共享基础映像”在中,
但是比这里描述的场景更灵活。

这种模式很灵活,对我来说效果很好。 本例中的当前目录是父目录 包含静态资产的资产的 在名为“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
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的缓存能力 部分映像供将来的构建使用

核心理念与选项基本相同 “共享基础映像”在中,
但是比这里描述的场景更灵活。

符号链接在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-bad1
    指向仅存在于主机上的路径,请改用相对路径
  • link-bad2
    指向映像中不存在的相对路径,因为您将目录添加为
    /image/proj*
    ,因此映像文件系统中没有
    路径2
  • link-bad3
    指向从未包含在图像中的文件,
    COPY
    命令不跟随链接

符号链接在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-bad1
    指向仅存在于主机上的路径,请改用相对路径
  • link-bad2
    指向映像中不存在的相对路径,因为您将目录添加为
    /image/proj*
    ,因此映像文件系统中没有
    路径2
  • link-bad3
    指向从未包含在图像中的文件,
    COPY
    命令不跟随链接

我不想将符号链接放在容器中,而是想解决Docker在构建Docker映像时在COPY命令中限制使用源数据符号链接的问题。我试图在问题中澄清这一点。@crip此答案描述了在使用“复制”命令生成图像时,只要将符号链接视为符号链接,而不是符号链接所指向的内容,就如何对使用符号链接没有设计限制。这不是docker的限制,只是当您使用Linux实用程序(如tar)对符号链接进行打包时符号链接的行为。我并不是试图将符号链接放入容器中,而是为了解决docker在构建docker映像时在COPY命令中对源数据使用符号链接的限制。我试图在问题中澄清这一点。@crip此答案描述了在使用“复制”命令生成图像时,只要将符号链接视为符号链接,而不是符号链接所指向的内容,就如何对使用符号链接没有设计限制。这不是docker限制,只是当您使用Linux实用程序(如tar)对符号链接进行打包时符号链接的行为。