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

    xiaoxiao2025-04-06  38

    假设你的 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》

     

    最新回复(0)