使用代理進(jìn)行 docker build 問題的解決思路

問題描述

在使用 docker build 打包鏡像時(shí),遇到了需要使用代理訪問網(wǎng)絡(luò)的需求。使用如下的 Dockerfile 來模擬這個(gè)場(chǎng)景:

FROM golang:1.12
RUN curl www.google.com --max-time 3

國(guó)內(nèi)一般網(wǎng)絡(luò)環(huán)境下,curl www.google.com 是無法正常返回的,加入 --max-time 讓 curl 的耗時(shí)不要太長(zhǎng)。

配置 http_proxy 變量

首先需要在環(huán)境變量中設(shè)置 http_proxy 和 https_proxy,使得訪問網(wǎng)絡(luò)的命令(這里使用 curl 來代表)能夠通過環(huán)境變量中配置的代理服務(wù)器訪問 www.google.com。

docker build 命令雖然是在 docker 所在的宿主機(jī)上執(zhí)行的,看上去像是直接使用了宿主機(jī)的網(wǎng)絡(luò)環(huán)境,但實(shí)際上 docker build 也是啟動(dòng)了一個(gè) container 進(jìn)行構(gòu)建,所以在構(gòu)建過程中的所有命令都是在 container 中執(zhí)行的,http_proxy 和 https_proxy 的配置也應(yīng)該是在 container 中進(jìn)行的。可以使用 ENV 來配置 container 中的環(huán)境變量。

代理服務(wù)器啟動(dòng)在宿主機(jī)的 1087 端口上,修改 dockerfile 文件:

FROM golang:1.12

ENV http_proxy "http://127.0.0.1:1087"
ENV HTTP_PROXY "http://127.0.0.1:1087"
ENV https_proxy "http://127.0.0.1:1087"
ENV HTTPS_PROXY "http://127.0.0.1:1087"

RUN curl www.google.com --max-time 3

重新執(zhí)行 docker build 會(huì)發(fā)現(xiàn) curl 依舊無法訪問 www.google.com,從報(bào)錯(cuò)信息上可以看到 127.0.0.1 上的 1087 端口上并沒有服務(wù)。

訪問宿主機(jī)

由于 container 默認(rèn)是橋接網(wǎng)絡(luò),宿主機(jī)和 container 是平級(jí)的,被放在了一個(gè)虛擬的網(wǎng)段里。訪問宿主機(jī)上的代理服務(wù)器,對(duì)于 container 來說實(shí)際上是訪問另一臺(tái)機(jī)器上的服務(wù)器,127.0.0.1 指向的是 container 本身。在 docker 默認(rèn)的橋接網(wǎng)絡(luò)中,宿主機(jī)的 IP 一般是 172.17.0.1(Linux),或者 192.168.65.1(MacOS),可以將 http_proxy 中的 IP 換成 172.17.0.1/192.168.65.1,來實(shí)現(xiàn)通過宿主的代理服務(wù)器訪問網(wǎng)絡(luò),修改 dockerfile:

FROM golang:1.12

ENV http_proxy "http://172.17.0.1:1087"
ENV HTTP_PROXY "http://172.17.0.1:1087"
ENV https_proxy "http://172.17.0.1:1087"
ENV HTTPS_PROXY "http://172.17.0.1:1087"

RUN curl www.google.com --max-time 3

雖然使用這種方式可以達(dá)到目的,但是如果編譯環(huán)境變了或者代理服務(wù)器的配置變了,哪怕只是操作系統(tǒng)從 Linux 變成了 MacOS,都得修改 dockerfile,顯然不夠解耦,也不方便。

配置網(wǎng)絡(luò)模式

docker 中還有一種 host 網(wǎng)絡(luò)模式,就是讓 container 使用宿主機(jī)的網(wǎng)絡(luò),相當(dāng)于 container 在網(wǎng)絡(luò)層面和宿主機(jī)不做隔離,使用這種網(wǎng)絡(luò)模式執(zhí)行 docker build,就不需要在 dockerfile 中添加 http_proxy 環(huán)境變量,container 可以直接讀取宿主上的環(huán)境變量。

首先在宿主上導(dǎo)入 http_proxy 環(huán)境變量:

export http_proxy="http://127.0.0.1:1087";
export HTTP_PROXY="http://127.0.0.1:1087";
export https_proxy="http://127.0.0.1:1087";
export HTTPS_PROXY="http://127.0.0.1:1087"

接下來將 dockerfile 簡(jiǎn)化:

FROM golang:1.12
RUN curl www.google.com --max-time 3

重新執(zhí)行,curl 就可以像在宿主上直接執(zhí)行一樣,通過代理訪問 www.google.com 了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 五、Docker 端口映射 無論如何,這些 ip 是基于本地系統(tǒng)的并且容器的端口非本地主機(jī)是訪問不到的。此外,除了...
    R_X閱讀 1,972評(píng)論 0 7
  • 《Docker從入門到實(shí)踐》閱讀筆記 原書地址: https://yeasy.gitbooks.io/docker...
    GuoYuebo閱讀 11,672評(píng)論 1 39
  • 青年路有個(gè)燒烤店,生意不是最好,門面也不是最大。 這家店就像大街上的一個(gè)普通人,不起眼,但存在。 老板娘話不多,負(fù)...
    xukaiin閱讀 508評(píng)論 0 0
  • 1 講一個(gè)我的直男朋友程真。 有多直呢? 講講他的女朋友標(biāo)準(zhǔn)。 1身高最好一米六,瓜子臉,皮膚白,長(zhǎng)得漂亮,文靜愛...
    少女陸sunny閱讀 1,476評(píng)論 2 9
  • 1、只要不放棄,就沒有什么能讓自己退縮;只要夠堅(jiān)強(qiáng),就沒有什么能把自己打垮! 2、慢慢地,你不會(huì)再流淚;慢慢地,一...
    距離何止一顆心呢閱讀 434評(píng)論 0 0

友情鏈接更多精彩內(nèi)容