如何在 Docker 的构建上下文之外包含文件?

新手上路,请多包涵

如何使用 Docker 文件中的“ADD”命令包含来自 Docker 构建上下文之外的文件?

从 Docker 文档中:

路径必须在构建的上下文中;您不能添加 ../something/something,因为 docker 构建的第一步是将上下文目录(和子目录)发送到 docker 守护进程。

我不想仅仅为了在这件事上适应 Docker 而重组我的整个项目。我想将我所有的 Docker 文件保存在同一个子目录中。

此外,Docker 似乎还没有(并且可能永远不会)支持符号链接: Dockerfile ADD 命令不遵循主机#1676 上的符号链接。

我能想到的唯一另一件事是包含一个预构建步骤,将文件复制到 Docker 构建上下文中(并配置我的版本控制以忽略这些文件)。还有比这更好的解决方法吗?

原文由 ben_frankly 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 510
2 个回答

解决此问题的最佳方法是使用 -f 独立于构建上下文指定 Dockerfile。

例如,此命令将使 ADD 命令访问当前目录中的任何内容。

 docker build -f docker-files/Dockerfile .

更新:Docker 现在允许在构建上下文之外使用 Dockerfile(在 18.03.0-ce 中修复)。所以你也可以做类似的事情

docker build -f ../Dockerfile .

原文由 Cyberwiz 发布,翻译遵循 CC BY-SA 4.0 许可协议

我经常发现自己为此目的使用 --build-arg 选项。例如,将以下内容放入 Dockerfile 之后:

 ARG SSH_KEY
RUN echo "$SSH_KEY" > /root/.ssh/id_rsa

你可以这样做:

 docker build -t some-app --build-arg SSH_KEY="$(cat ~/file/outside/build/context/id_rsa)" .

但请注意 Docker 文档 中的以下警告:

警告:不建议使用构建时变量来传递 github 密钥、用户凭据等机密信息。使用 docker history 命令的图像的任何用户都可以看到构建时变量值。

原文由 aaron 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题