我给自己计时。从一个空目录和一个 Go 应用程序的想法开始,我需要多快才能在 OKE 上获得一个正在运行的部署?答案是 14 分钟。docker init 完成的工作比我预期的要多。
docker init 的作用
如果你还没有使用过它,docker init 是内置于 Docker 命令行界面中的一个交互式脚手架工具。你在项目目录中运行它,它会为你的语言生成一个优化过的 Dockerfile、.dockerignore 和 docker-compose.yml。
mkdir oci-api && cd oci-api
go mod init github.com/pmady/oci-api
# 编写一个简单的 API
cat > main.go << 'EOF'
package main
import (
"fmt"
"log"
"net/http"
"os"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "running on %s", os.Getenv("OCI_REGION"))
})
http.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(200)
})
log.Fatal(http.ListenAndServe(":8080", nil))
}
EOF
现在是神奇的部分:
$ docker init
欢迎使用 Docker Init 命令行界面!
? 你的项目使用什么应用程序平台? Go
? 你想使用哪个版本的 Go? 1.22
? 你的主包的相对目录是什么? .
? 你的服务器监听哪个端口? 8080
它生成了三个文件:
Dockerfile — 多阶段构建,无发行版基础镜像,非根用户。实际上是不错的默认设置。我见过团队手写的 Dockerfile 比这更糟糕。
compose.yaml — 带有端口映射和环境变量的基本设置。
.dockerignore — 排除 .git、二进制文件和 vendor 目录。很合理。
生成的 Dockerfile 看起来像这样(稍微简化):
FROM golang:1.22 AS build
WORKDIR /src
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o /bin/server .
FROM gcr.io/distroless/static-debian12:nonroot
COPY --from=build /bin/server /bin/
EXPOSE 8080
USER nonroot:nonroot
ENTRYPOINT ["/bin/server"]
多阶段、静态二进制、无发行版、非根用户。我自己也会写几乎相同的东西。我唯一做的改变是添加 -ldflags="-s -w" 以剥离调试符号并缩小二进制文件。
第 0-5 分钟:本地构建和测试
docker compose up --build
# 在另一个终端中
curl localhost:8080
# 运行于
免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。