在本节中,您将学习如何设置您的 Golang 应用程序以在您的机器上进行本地开发。开发容器的目的是保存所有依赖项(例如:第三方包,如GORM)、基础设施(例如:数据库、内存缓存等)和您的代码,以帮助和改进您的开发。
创建我们的应用程序仓库。
mkdir mullberry-backend cd mullberry-backend go mod init github.com/bartmika/mullberry-backend
|
每次要添加依赖项时,您都会关闭当前正在运行的容器并安装依赖项。按如下方式安装我们的依赖项:go get github.com/labstack/echo/v4 go get github.com/labstack/echo/v4/middleware@v4.7.2
|
在项目的根目录中创建一个main.go文件,然后将以下内容复制并粘贴到其中:
package main
import ( "net/http" "os"
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4/middleware" )
func main() {
e := echo.New()
e.Use(middleware.Logger()) e.Use(middleware.Recover())
e.GET("/", func(c echo.Context) error { return c.HTML(http.StatusOK, "Hello, Docker! <3") })
e.GET("/ping", func(c echo.Context) error { return c.JSON(http.StatusOK, struct{ Status string }{Status: "OK"}) })
httpPort := os.Getenv("HTTP_PORT") if httpPort == "" { httpPort = "8080" }
e.Logger.Fatal(e.Start(":" + httpPort)) }
|
请注意,上面的代码是通过他们的 Docker 文档从“构建你的 Go 映像”复制而来的。在创建任何与 docker 相关的内容之前,请创建一个.dockerignore文件并复制并粘贴以下内容:
bin .dockerignore Dockerfile docker-compose.yml dev.Dockerfile dev.docker-compose.yml .env
|
什么是.dockerignore文件?本质上,它类似于.gitignore某些文件/文件夹不会保存到 docker 容器和图像中。创建dev.Dockerfile文件并将以下内容复制并粘贴到其中。
FROM golang:1.18
# Copy application data into image COPY . /go/src/bartmika/mullberry-backend WORKDIR /go/src/bartmika/mullberry-backend
COPY go.mod ./ COPY go.sum ./ RUN go mod download
# Copy only `.go` files, if you want all files to be copied then replace `with `COPY . .` for the code below. COPY *.go .
# Install our third-party application for hot-reloading capability. RUN ["go", "get", "github.com/githubnemo/CompileDaemon"] RUN ["go", "install", "github.com/githubnemo/CompileDaemon"]
ENTRYPOINT CompileDaemon -polling -log-prefix=false -build="go build ." -command="./mullberry-backend" -directory="./"
|
如果您阅读上面的代码注释,您会注意到 的用法CompileDaemon,那是什么?本质上,这是您的热加载器!它监视目录中的文件并在文件更改时.go调用。go build例如,您在AtomIDE 中打开此项目,对main.go文件进行更改并单击Save,然后CompileDaemon将在容器中重新构建您的 Go 应用程序,以便您看到最新的构建!创建我们的dev.docker-compose.yml文件:
version: '3.6'
services: api: container_name: mullberry-backend image: mullberry-backend ports: - 8000:8080 volumes: - ./:/go/src/bartmika/mullberry-backend build: dockerfile: dev.Dockerfile
|
等等,为什么我使用dev.这些 Docker 文件名的前缀?原因是因为我想区分 Docker 文件用于生产和开发目的。在您的终端中,使用以下命令启动开发环境:
$ docker-compose -f dev.docker-compose.yml up
确认我们可以访问它。
$ curl localhost:8000/
您应该在终端中看到以下输出:
Hello, Docker! <3
如果你看到这个,恭喜你已经准备好开始开发了!如果您想了解更多信息,请随时通过他们的 Docker 文档查看“构建您的 Go 映像”一文。
用于生产的 Golang 和 Docker
本节的目的是让您的 Golang 应用程序容器化并准备好在生产环境中运行。
选项 1:单级
最简单的设置是单阶段构建。这个构建的问题是你的 Docker 镜像会很大!
首先,Dockerfile在您的项目根文件夹中创建一个并将以下内容复制并粘贴到其中:
FROM golang:1.18
# Copy application data into image COPY . /go/src/bartmika/mullberry-backend WORKDIR /go/src/bartmika/mullberry-backend
COPY go.mod ./ COPY go.sum ./ RUN go mod download
# Copy only `.go` files, if you want all files to be copied then replace `with `COPY . .` for the code below. COPY *.go .
# Build our application. RUN go build -o ./bin/mullberry-backend
EXPOSE 8080
# Run the application. CMD ["./bin/mullberry-backend"]
|
然后运行up,你应该看到它工作:$ docker-compose up
选项 2:多阶段
一个更复杂的设置称为磁盘空间节省的多阶段构建授予。这个想法是你想在一个容器中构建你的 Golang 应用程序,然后将它移动到另一个更小的容器中,从而留下磁盘空间沉重的容器。
如果您想尝试一下,Dockerfile请在您的项目根文件夹中创建一个并将以下内容复制并粘贴到其中:
## ## Build ## FROM golang:1.18-alpine as dev-env
# Copy application data into image COPY . /go/src/bartmika/mullberry-backend WORKDIR /go/src/bartmika/mullberry-backend
COPY go.mod ./ COPY go.sum ./ RUN go mod download
# Copy only `.go` files, if you want all files to be copied then replace `with `COPY . .` for the code below. COPY *.go .
# Build our application. # RUN go build -o /go/src/bartmika/mullberry-backend/bin/mullberry-backend RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -gcflags "all=-N -l" -o /server
## ## Deploy ## FROM alpine:latest RUN mkdir /data
COPY --from=dev-env /server ./ CMD ["./server"]
|
然后运行up,你应该看到它工作:$ docker-compose up