Press "Enter" to skip to content

Go + Docker + Gitlab

本篇文章介绍如何在本地进行 Go 编码,使用 GitLab 私有库,并且同时在 Docker 环境中编译运行的方案

每当我们开发一个新的项目时,经常用到 Mysql、Redis、Mongodb 等服务,通常情况下即使我们的 Mac(Windows) 上恰好安装了服务,也会遇到版本太旧或者不能服务等各种环境问题。一般情况下通过虚拟机可以解决这个问题,每次安转新的虚拟机环境,并且在虚拟机上开发。但是这样用起来太重了,每次都启动新的虚拟机,很麻烦。现在有了 Docker 我们就不必这样麻烦了,Docker 极大的降低了程序员开发项目过程中对环境得各种依赖,可以说是程序员的神器。今天我就分享一下,如何在 Docker 中使用 Go 语言开发项目,并且实现本地调试,Docker 自动运行的方法。

如果你不清楚如何使用 Docker 或者不了解它是如何运作的,可以查看官网文档

搭建环境

代码结构如下(业务代码不在本次讨论范围内):

初始化代码

在代码目录运行 go mod init github.com/jiangnanandi/go-docker,完成初始化,将自动生成文件如下(当然你需要把 Github 仓库名称改成自己的名字):

go.mod

module github.com/jiangnanandi/go-docker

go 1.12

main.go

package main

import (
	"fmt"
)

func main() {
    fmt.Println("Hello, world!")
}

此时运行程序,将在命令行打印输出 Hello World

配置开发环境的 Dockerfile

dev.dockerfile

FROM golang:1.13-buster
RUN go get github.com/cespare/reflex
WORKDIR /app
COPY . .
ENTRYPOINT ["reflex", "-c", "reflex.conf"]

配置中使用了 reflex ,它的作用是监控代码的变动,如有修改则重新启动服务,可以查看配置 reflex.conf

reflex.conf

-r '(\.go$|go\.mod)' -s go run .

这里意味着每当 .go 或者 go.mod 文件发生改变重新运行 go run .

编译运行 Docker

docker build -t go-docker -f dev.dockerfile .

docker run -it --rm -v `pwd`:/app --name go-docker go-docker

此时,通过 docker 配置文件我们会生成一个名为 go-docker 的 docker 环境,并且将本地目录映射为 Docker 环境的 /app 目录,并且每当 .go 或者 go.mod 文件做出修改,就会重启服务。

解决 Docker 中获取 gitlab 私有库代码问题

我在 Go 项目中使用了 GitLab 的私有代码库,如果想要在 Docker 中使用,可以通过通过如下方法,将本地的 id_rsa 文件加入项目中,Dockerfile 文件:

将 git.xxx.com 换成自己的域名即可

FROM golang:1.13-buster
USER root
RUN apt-get update
RUN apt-get install -y git
RUN go get github.com/cespare/reflex
# 替换 git 配置,解决 go get 可以获取私有库代码
RUN git config --global url."git@git.xxx.com:".insteadOf "https://git.xxx.com"

# 传入参数解决 gitlab 私有库问题
ARG SSH_PRIVATE_KEY
RUN mkdir /root/.ssh/
RUN echo "${SSH_PRIVATE_KEY}" > /root/.ssh/id_rsa
RUN chmod 600 /root/.ssh/id_rsa

RUN touch /root/.ssh/config
RUN echo "StrictHostKeyChecking no" > /root/.ssh/config
RUN echo "UserKnownHostsFile /dev/null" >> /root/.ssh/config


WORKDIR /app
COPY . .
ENTRYPOINT ["reflex", "-c","reflex.conf"]

编译和启动 Docker:

docker build --build-arg SSH_PRIVATE_KEY="$(cat ./id_rsa)" -t go-docker -f dev.dockerfile .

docker run  -it --rm -v `pwd`:/app --name go-docker go-docker

docker-compose

通过 docker-compose.yml 文件,我们可以更方便的配置 Docker 中的服务,例如 Mongodb、Redis 等服务,通常配置如下,大家可以参考:

version: "3"
services:
  server:
    build:
      context: .
      dockerfile: dev.dockerfile
    ports:
      - 8080:1323 #host:container
    volumes:
      - .:/app
    environment:
      - GOPROXY

结论

我已经在自己的项目中使用了这种方式进行开发,它极大的方便了程序员对环境的依赖,把注意力集中在业务代码开发上边,同时 Docker 也非常有利新人的快速接入,推荐大家在自己的项目中使用。

可以通过下边链接访问 Github 代码:

https://github.com/jiangnanandi/go-docker

Be First to Comment

发表评论

电子邮件地址不会被公开。 必填项已用*标注