Routing 如何在';docker build';

Routing 如何在';docker build';,routing,docker,containers,host,Routing,Docker,Containers,Host,TL;DR 我的Dockerfile有一个RUN步骤,该步骤执行从构建服务器下载构建的shell脚本。我希望此生成服务器位于我的docker主机上,以便快速传输。如果可能的话,我如何让容器旋转起来,以便docker build命令路由到我的主机(当然,不必去互联网) 详细信息 我有一个相当大的代码库(>500MB),我想在docker容器中建立并运行它。因为repo非常大,所以使用ADD指令暂存代码不仅需要花费大量时间,而且在docker容器中占用的空间也比我希望的要多(我构建的频率足够高,空间

TL;DR
我的Dockerfile有一个
RUN
步骤,该步骤执行从构建服务器下载构建的shell脚本。我希望此生成服务器位于我的docker主机上,以便快速传输。如果可能的话,我如何让容器旋转起来,以便
docker build
命令路由到我的主机(当然,不必去互联网)

详细信息
我有一个相当大的代码库(>500MB),我想在docker容器中建立并运行它。因为repo非常大,所以使用
ADD
指令暂存代码不仅需要花费大量时间,而且在docker容器中占用的空间也比我希望的要多(我构建的频率足够高,空间限制是一个问题)。我对这个问题的解决办法是:

  • 从已暂存“我的代码回购”的基础映像中提取
  • 使用执行shell脚本的
    RUN
    步骤,该脚本将最新代码作为tarball下载、解压,并将内容重新同步到已执行的repo
我的Dockerfile如下所示:

FROM my.image.server.com/base/image:latest

ADD build.sh /tmp/build.sh
RUN cd /tmp && bash ./build.sh && rm -f build.sh
#!/bin/bash

# Start from a clean state
rm -rf ./tmp/repo
mkdir -p ./tmp/repo

# Download my tar'd repo
wget http://my.build.server.com/repo.tar
wget http://my.build.server.com/repo.tar.sha1
shasum -C repo.tar.sha1
tar -xf repo -C ./tmp/repo

# Stage changed code; /opt/repo is where the code lives in my base image
rsync -a --delete ./tmp/repo /opt/repo

# Clean up so my image is as small as possible
rm -rf repo.tar*
rm -rf ./tmp/website
build.sh看起来像这样:

FROM my.image.server.com/base/image:latest

ADD build.sh /tmp/build.sh
RUN cd /tmp && bash ./build.sh && rm -f build.sh
#!/bin/bash

# Start from a clean state
rm -rf ./tmp/repo
mkdir -p ./tmp/repo

# Download my tar'd repo
wget http://my.build.server.com/repo.tar
wget http://my.build.server.com/repo.tar.sha1
shasum -C repo.tar.sha1
tar -xf repo -C ./tmp/repo

# Stage changed code; /opt/repo is where the code lives in my base image
rsync -a --delete ./tmp/repo /opt/repo

# Clean up so my image is as small as possible
rm -rf repo.tar*
rm -rf ./tmp/website
这对于保持我的图像较小非常有效,并且加快了docker构建的速度。但是,我希望通过本地下载tarball(即从docker主机上运行的文件服务器)来加快速度。不幸的是,为
docker build
步骤旋转的docker容器无法路由到我的主机


我知道在旋转容器(即
docker run
)时,可以将端口从主机转发到容器,并将主机桥接到容器,但在
docker build
期间,无法找到任何关于如何从docker容器路由到主机的文档。这可能吗?如果是这样的话,我如何才能做到这一点呢?

我认为在构建过程中没有一种很好的方法来访问主机,但它是可以访问的:使用
ifconfig
或类似工具查看主机的IP地址

例如,我的
en0
当前有地址
10.0.1.17
(一个专用子网)。如果您的文件服务器正在侦听该接口,那么build.sh可能会说

wget http://10.0.1.17/repo.tar

当然,问题是,除非您希望其他人与您的文件服务器通信,否则您不能将此Dockerfile提供给其他人,并且如果您使用DHCP,您的IP将发生更改。你可以做一些其他的事情来解决这个问题,比如添加你自己的网络接口。

太棒了。我没有意识到容器将路由到主机上的任何接口。为此目的,在主机上创建虚拟接口非常有效。值得一提的是,我并不关心Dockerfile的可移植性,因为它将存在于API之后,并由API控制,开发人员可以将其端点发布到该API以创建构建和部署。如果您希望将来保持Dockerfile的可移植性,您可以使用多个
COPY
命令来复制Dockerfile末尾最常更改的文件/目录。这样,构建映像不会每次都复制所有文件。见