Docker 学习一:使用 golang 镜像运行自己的 go 程序-操作过程及遇到问题解决办法

假设你的 go 应用程序在 comm_mock_svr/ 目录下,操作过程如下:

a. 切换到你的 go 应用程序所在目录: cd comm_mock_svr
b. 新建 Dockerfile 文件: tee ./Dockerfile <<-'EOF' ,写入如下内容:
FROM golang
WORKDIR /go/src

#以下指令将 comm_mock_svr 目录下内容(包括子目录)复制到容器内的 /go/src/comm_mock_svr/ 目录下
COPY ./ comm_mock_svr/
WORKDIR /go/src/comm_mock_svr
#RUN go get -d -v golang.org/x/crypto/ssh github.com/pkg/sftp github.com/kr/fs \
#       github.com/pkg/errors golang.org/x/text golang.org/x/text/transform

#以下指令自动下载 comm_mock_svr 所导入的第三方库,可能需要走代理才能下载,下面具体说明代理配置问题
RUN go get -d -v ./...
RUN go install -v .
EXPOSE 6610
ENTRYPOINT [ "comm_mock_svr", "-output", "console"]
EOF


c. 构建镜像:
docker build \
--build-arg http_proxy=http://192.168.11.5:1087 \
--build-arg https_proxy=http://192.168.11.5:1087 \
-t comm_mock_svr .

d. 启动容器:
docker run -it --name mock_svr -p 6610:6610 comm_mock_svr
正常将成功运行。

特别说明:
a. COPY 指令如果期望复制包含子目录的全部内容,则目标地址应该是一个目录格式,以 / 结尾。
b. docker build 期间 go get 要走代理,否则无法下载依赖库。另一种做法,不使用 go get, 将事先下载好的依赖包全部复制到容器内部。
c. 由于 golang 官方基础镜像比较大,近 800M,由此构建出来的镜像同样也巨大无比,建议只是在开发阶段使用。

d. 关于 docker build 时让 go get 走宿主机 http 代理的特殊注意事项:
http 代理地址不可使用 127.0.0.1 ,否则 go get 会报 Connection refused. 错误信息类似如下:

Fetching https://golang.org/x/crypto/ssh?go-get=1
https fetch failed: Get https://golang.org/x/crypto/ssh?go-get=1: proxyconnect tcp: dial tcp 127.0.0.1:1087: connect: connection refused
package golang.org/x/crypto/ssh: unrecognized import path "golang.org/x/crypto/ssh" (https fetch: Get https://golang.org/x/crypto/ssh?go-get=1: proxyconnect tcp: dial tcp 127.0.0.1:1087: connect: connection refused)
Fetching https://golang.org/x/text/encoding/simplifiedchinese?go-get=1
https fetch failed: Get https://golang.org/x/text/encoding/simplifiedchinese?go-get=1: proxyconnect tcp: dial tcp 127.0.0.1:1087: connect: connection refused


正确做法是设置 http 代理服务器的 IP 为 0.0.0.0(mac 上ShadowsocksX-NG可直接界面配置),然后在 docker build 时使用非回环地址 127.0.0.1,而是用本机网卡的 IP。例如
docker build \
--build-arg http_proxy=http://192.168.11.5:1087 \
--build-arg https_proxy=http://192.168.11.5:1087 \
-t comm_mock_svr .

按如上方式,即可正常。

 

另外,附上一篇关于 Docker 走代理该如何配置的好文章:

《Ultimate Guide to Docker HTTP Proxy Configuration》

 

你可能感兴趣的:(docker,golang,docker,golang,go,get,http,代理)