一、 前言

docker
dockerGolangGolangdockerGolangcgo
Golang
dockerGolangGolang
vi main.go
package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"os"
)

func main() {
	resp, err := http.Get("https://www.baidu.com")
	check(err)
	body, err := ioutil.ReadAll(resp.Body)
	check(err)
	fmt.Println(len(body))
}

func check(err error) {
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
}

这是一个简单的程序,拉取百度的页面,并计算页面的字节大小。

https
dockerfile

1. 基于完整镜像

Golang
vi dockerfile
FROM golang:latest
RUN mkdir /app 
ADD . /app/ 
WORKDIR /app 
RUN go build -o main . 
CMD ["/app/main"]
golang:latest/app/app/appRUN cd /appGolangCMD

具体命令解释查看:Dockerfile 指令详情

1) 当前目录下文件

admin@dingdayu-DS:/volume1/docker/docker-golang$ ls
dockerfile  main.go

2) 编译镜像

sudo docker build -t golang-latest-app .

受制于网络和机器的性能,编译镜像,竟然花了20多分钟。。。

scratch
sudo docker run -it --rm --name my-golang-app golang-latest-app

执行镜像,查看效果:

scratch
scratchGolang
Golang
scratch
CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .
GOOS=linuxLinuxMacWin-installsuffix cgonet
dockerfile
vi dockerfile
FROM scratch
RUN mkdir /app
ADD main /app/
WORKDIR /app
CMD ["/app/main"]

3) 编译镜像

sudo docker build -t golang-scratch-app .
scratchgolang:latest

4) 空白镜像挂载文件

启动镜像

sudo docker run -it --rm --name my-golang-scratch golang-scratch-app

你会发现提示:

Get https://www.baidu.com: x509: failed to load system roots and no roots provided

这是一个非常常见的问题:为了进行SSL请求,我们需要SSL根证书。

5) 挂载文件

Gox509Go/etc/ssl/certs/cacert.pemLinux VMcacert.pemDocker
cacert.pem
wget https://curl.haxx.se/ca/cacert.pem
dockerfile
FROM scratch
ADD cacert.pem /etc/ssl/certs/
ADD main /
CMD ["/main"]

6) 执行镜像

sudo docker run -it --rm --name my-golang-scratch golang-scratch-app

完美执行!

四、 关键点

sudo docker build -t golang-latest-app .golang-latest-app 为镜像名sudo docker run -it --rm --name my-golang-app golang-latest-appmy-golang-app 为容器名,golang-latest-app 为镜像名CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .

五、 链接