一、 前言
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 .