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