在本地可以顺利构建镜像,在测试服务器上却报错了。截图如下
表现的形式主要是安装一些网络包无法进行,例如apk add xxx
在图中可以发现,在Dockerfile执行到pip安装下载依赖时就会卡住。
并不是Dockerfile的编译错误,而是什么“Temporary failure in name resolution”错误。
1.假设服务器网络问题
为了不影响服务器现有环境,我新建一个虚拟环境,执行pip相关依赖的下载。
发现测试服务器网络是通的。没有问题。
2.由于我使用了pip阿里云镜像源,假设无法解析阿里云镜像源域名。
经过测试发现,不仅网络是通的,而且延迟相当低。
3.容器内部网络问题
在不断缩小范围后,开始排查容器的网络问题。
经过一番查询,得到如下结果:
docker build
镜像时,默认使用网桥(bridge)模式,容器时虚拟环境,没有自己的网卡,所以无法连接网络。
好在docker在构建(build)或者运行(run)镜像时都提供了选择网络的参数,我们可以使用宿主机的网络,也就是这台测试服务器。
经过查询docker的官方文档,找了docker build
时设置网络的参数--network
解决问题
在构建镜像时,在命令最后带上--network host
即可。
docker build -t <镜像名> . --network host