创建服务
package main
import (
"fmt"
"net/http"
)
func handlerHello(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "hello docker")
}
func main() {
http.HandleFunc("/", handlerHello)
fmt.Println("run 8080")
http.ListenAndServe(":8080", nil)
}
dockerFIle
进入工作目录
/Users/zhangsan/Documents/GitHub/web-test
-> % tree
.
├── dockerfile
├── go.mod
└── main.go
0 directories, 3 files
docker内容
FROM golang:latest
ENV GO111MODULE=on \
CGO_ENABLED=1
WORKDIR /Users/zhangsan/Documents/GitHub/web-test
COPY . /Users/zhangsan/Documents/GitHub/web-test
RUN go build .
EXPOSE 8080
ENTRYPOINT ["./web-test"]
FROM 母镜像
MAINTAINER 维护者信息
WORKDIR工作目录
ADD 将文件复制到镜像中
RUN 执行操作
EXPOSE 监听端口
ENTRYPOINT 程序入口
项目目录执行
docker build -t testweb .
-> % docker build -t testweb .
Sending build context to Docker daemon 4.096kB
Step 1/7 : FROM golang:latest
---> 028d102f774a
Step 2/7 : ENV GO111MODULE=on CGO_ENABLED=1
---> Using cache
---> 3aec09f7569c
Step 3/7 : WORKDIR /Users/zhangsan/Documents/GitHub/web-test
---> Running in cf907f5da8e0
Removing intermediate container cf907f5da8e0
---> e111905b2f0c
Step 4/7 : COPY . /Users/zhangsan/Documents/GitHub/web-test
---> 5c06746de2df
Step 5/7 : RUN go build .
---> Running in 85ee6f5aa4fe
Removing intermediate container 85ee6f5aa4fe
---> 6cbafd7f5b58
Step 6/7 : EXPOSE 8080
---> Running in eefd150be5ea
Removing intermediate container eefd150be5ea
---> baf71f368cfa
Step 7/7 : ENTRYPOINT ["./web-test"]
---> Running in b75142748ae3
Removing intermediate container b75142748ae3
---> c88bc3a4ff72
Successfully built c88bc3a4ff72
Successfully tagged testweb:latest
#启动景象
-> % docker run -p 8080:8080 -d testweb
b0e843cc8e3063769c35905a4c0a01749d1c4129d1283accdc31d3e9aaac7b6a
验证
-> % curl http://localhost:8080/
hello docker%
FROM golang:1.13.0-stretch AS builder
ENV GO111MODULE=on \
CGO_ENABLED=1
WORKDIR /build
# 缓存 mod 检索-那些不常更改的模块
# 复制构建应用程序所需的代码
# 可能需要更改下边的命令,只复制您实际需要的内容。
COPY . /build
RUN go mod tidy && go mod download && go mod vendor
# 构建应用程序
RUN go build .
# 我们创建一个 /dist 目录, 仅包含运行时必须的文件
# 然后,他会被复制到输出镜像的 / (根目录)
WORKDIR /dist
RUN cp /build/web-test ./web-test
# 可选项:如果您的应用程序使用动态链接(通常情况下使用 CGO),
# 这将收集相关库,以便稍后将它们复制到最终镜像
# 注意: 确保您遵守您复制和分发的库的许可条款
RUN ldd web-test | tr -s '[:blank:]' '\n' | grep '^/' | \
xargs -I % sh -c 'mkdir -p $(dirname ./%); cp % ./%;'
RUN mkdir -p lib64 && cp /lib64/ld-linux-x86-64.so.2 lib64/
# 在运行时复制或创建您的应用程序需要的其他目录/文件。
# 例如,本例使用 /data 作为工作目录,在正常运行容器时,该目录可能绑定到永久目录
RUN mkdir /data
# 构建最小运行时镜像
FROM scratch
COPY --chown=0:0 --from=builder /dist /
# 设置应用程序以 /data 文件夹中的非 root 用户身份运
# User ID 65534 通常是 'nobody' 用户.
# 映像的执行者仍应在安装过程中指定一个用户。
COPY --chown=65534:0 --from=builder /data /data
USER 65534
WORKDIR /data
EXPOSE 8080
ENTRYPOINT ["./web-test"]