TL; DR
我的Dockerfile有一个RUN
步骤,用于执行从构建服务器下载构建的shell脚本。我希望这个构建服务器能够在我的docker主机上进行快速传输。如果可能的话,我怎样才能让容器旋转出来以便docker build
命令路由到我的主机(当然不用去互联网)?
详情
我有一个相当大的代码存储库(> 500MB),我想在docker容器中暂存和运行。因为repo是如此之大,使用ADD
指令暂存代码不仅需要花费大量时间,而且还占用了我的docker容器中比我更喜欢的空间(我经常建立足够的空间)空间限制是一个问题)。我对这个问题的解决方案是:
RUN
步骤,该脚本将最新代码作为tarball下载,解压缩,并将内容rsyncs到已经上传的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主机上运行的文件服务器)来加快速度。不幸的是,为docker build
步骤旋转的docker容器无法路由到我的主机。
我知道可以在启动容器时将端口从主机转发到容器并将主机桥接到容器(即docker run
),但是我们无法找到有关如何路由的任何文档在docker build
期间从docker容器到主机。这可能吗?如果是这样,我怎么能做到这一点?
答案 0 :(得分:1)
我认为在构建期间访问主机的方式非常简单,但可以访问:使用ifconfig
或类似内容查看主机的IP地址。
例如,我的en0
目前有地址10.0.1.17
(私有子网)。如果您的文件服务器正在侦听该接口,那么您的build.sh可以说
wget http://10.0.1.17/repo.tar
问题当然是,除非您希望他们与您的文件服务器通信,否则您无法将此Docker文件提供给其他人,如果您使用的是DHCP,那么IP将改变。你可以做一些其他事情来解决这个问题,比如添加自己的网络接口。