如何在 'docker build' 期间路由到 docker 容器中的主机
How to route to host in docker container during 'docker build'
TL;DR
我的 Dockerfile 有一个 RUN
步骤,它执行一个 shell 脚本,从构建服务器下载一个构建。我希望此构建服务器位于我的 docker 主机上以便快速传输。如果可能的话,我怎样才能让容器为 docker build
命令旋转以路由到我的主机(当然不用去互联网)?
详情
我有一个相当大的代码存储库 (>500MB),我想在 docker 容器中暂存和 运行。因为 repo 非常大,使用 ADD
指令暂存代码不仅需要大量时间,而且在我的 docker 容器中占用的 space 比我本来要多喜欢(我经常构建 space 约束是一个问题)。我对这个问题的解决方案是:
- 从已上演我的代码存储库的基础映像中提取
- 利用
RUN
步骤执行 shell 脚本,将最新代码下载为 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
而 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 build
步骤。但是,我想通过在本地下载 tarball 来加快速度(即从我的 docker 主机上的文件服务器 运行ning)。不幸的是,为 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会改变。你可以做一些其他的事情来解决这个问题,比如添加你自己的网络接口。
TL;DR
我的 Dockerfile 有一个 RUN
步骤,它执行一个 shell 脚本,从构建服务器下载一个构建。我希望此构建服务器位于我的 docker 主机上以便快速传输。如果可能的话,我怎样才能让容器为 docker build
命令旋转以路由到我的主机(当然不用去互联网)?
详情
我有一个相当大的代码存储库 (>500MB),我想在 docker 容器中暂存和 运行。因为 repo 非常大,使用 ADD
指令暂存代码不仅需要大量时间,而且在我的 docker 容器中占用的 space 比我本来要多喜欢(我经常构建 space 约束是一个问题)。我对这个问题的解决方案是:
- 从已上演我的代码存储库的基础映像中提取
- 利用
RUN
步骤执行 shell 脚本,将最新代码下载为 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
而 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 build
步骤。但是,我想通过在本地下载 tarball 来加快速度(即从我的 docker 主机上的文件服务器 运行ning)。不幸的是,为 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会改变。你可以做一些其他的事情来解决这个问题,比如添加你自己的网络接口。