【问题标题】:How do I get the address of the host when using 'docker build'?使用“docker build”时如何获取主机地址?
【发布时间】:2016-04-17 18:01:31
【问题描述】:

我需要在 Docker 构建期间在 Dockerfile 中引用主机或主机网络,我该怎么做?我想这样做,克隆一些 git repos,或者 scp 一些文件来设置图像。

克隆一个 github repo 很容易,因为 docker 会为此解析 dns。但是,我没有可用于正在构建的 docker 映像的主机网络的 dns 条目。

其实我连主机的ip地址都不知道,更别提设置dns了。

【问题讨论】:

  • 我想我将以不同的方式处理这个问题 - 从我的图像中需要的源创建 .deb 工件。将它们从 CI 构建放置的任何位置 scp 到当前目录。使用该目录作为上下文构建 - 并在 docker 容器中使用 dpkg 安装它们。

标签: docker


【解决方案1】:

您尝试做的事情与 Dockerfile 的想法背道而驰。

Dockerfile 的目的是提供图像的“描述”,同时保证可再现性。这就是为什么您的 Dockerfile 中没有任何特定主机的原因,因此可以在任何地方构建它并获得相同的结果。

如果您需要与主机进行更密切的交互,这意味着您的结果将与该主机紧密相关,您应该在运行时进行。查看CMDENTRYPOINT 让容器在启动时执行某些操作。

【讨论】:

  • 我不想在 Docker Hub 上共享这些 Dockerfile 并将我的源代码放在 GitHub 上,这段代码是私有的。我要做的就是在构建期间将私有源获取到图像上。它只会构建在特定的主机网络上,这是真的,但生成的图像仍然能够部署到云端。
  • 但我认为你的回答是公平的;如果它违背了 Dockerfile 的想法,我应该做我想做的另一种方式。请参阅我对 OP 的评论,我将构建一些 .deb 包,然后将它们放入构建上下文中,然后运行“docker build”。
【解决方案2】:

从 docker api 1.25 开始,您现在可以简单地执行以下操作:

docker build --network=host -f myDockerFile ...

这将使您能够在构建期间访问主机网络。

【讨论】:

    【解决方案3】:

    您不知道 Docker 主机似乎很奇怪。我什至无法理解这怎么可能。

    只需在构建期间传递主机信息即可。

    docker run -e DOCKER_HOST=1.2.3.4 busybox env

    或者,您将不得不使用某种发现系统,例如 DNS、etcd、zookeeper 或 consul。

    【讨论】:

    • 但我想使用 'docker build' 而不是 'docker run'。
    • 那么你的问题不是码头工人的问题。在docker build 发生之前,您需要一个脚本来修改您的 Dockerfile,或者您需要使用 DNS 的经典发现方法。
    猜你喜欢
    • 2014-05-21
    • 2013-06-14
    • 1970-01-01
    • 2022-06-29
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    相关资源
    最近更新 更多