Day17 Preparation of Gin and Env

Preface

由於之後我们会解说到像是Gin搭配RDBMS或是Gin搭配Cache....等,因此在这章节我们将会写好我们gin example所要用到的Dockerfile以及搭配的docker-compose。

Dockerfile

FROM golang:latest

RUN mkdir -p /usr/local/go/src/ironman-2021
WORKDIR /usr/local/go/src/ironman-2021
ADD . /usr/local/go/src/ironman-2021

RUN go mod download
RUN go build ./main.go

EXPOSE 8080
CMD ["./main"]
  • 首先,创建一个directory在预设的$GOPATH之下
  • 接下来则是执行go mod download,下载所有用到的第三方套件
  • 最後则是执行main.go 主程序档
  • 然後对外暴露8080 port

对docker不熟者可以去参考我去年的铁人赛文章,连结在此

https://ithelp.ithome.com.tw/users/20129737/ironman/3501

前半部分都是围绕着docker以及docker-compose解说

docker-compose

version: '3.5'
services:
  postgresql:
    container_name: postgresql
    image: postgres:12.7
    healthcheck:
      test: [ "CMD", "pg_isready", "-q", "-d", "postgres", "-U", "root" ]
      timeout: 45s
      interval: 10s
      retries: 10
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_USER=root
      - POSTGRES_PASSWORD=password
      - APP_DB_USER=ironman
      - APP_DB_PASS=password
      - APP_DB_NAME=gorm
    volumes:
    - ./db:/docker-entrypoint-initdb.d/
    networks:
      - backend-bridge
    restart: always
  redis:
    container_name: redis
    image: redis:latest
    ports:
    - "6379:6379"
    networks:
      - backend-bridge
    restart: always
  ironman-2021:
    container_name: ironman-2021
    ports:
      - "8080:8080"
    build:
      context: ./
      dockerfile: Dockerfile
    command: ./main
    restart: always
    networks:
      - backend-bridge
    depends_on:
      - postgresql
      - redis

networks:
  backend-bridge:
    driver: bridge

volumes:
  data: {}
  • 第一个container为postgresql,比较特别的是我们有帮他写个health check以及将data mount出来,但这并非必要,然後environment的部分,除了直接写在compose内宣告环境变数外,也可使用吃env extension file的形式汇入,而这个container会在之後的gorm篇章使用到。
  • 第二个container则是redis,这里就没什麽特别的了,然後该container则是会在後面与cache有关的章节用到。
  • 最後则是gin主程序的container。

以上部分也是如有不懂可以参考我去年铁人赛文章!

https://ithelp.ithome.com.tw/users/20129737/ironman/3501

前半部分都是围绕着docker以及docker-compose解说

main.go

最後则是main.go部分,它与day-16 branch比起来多了汇入.env变数的部分!

package main

import (
	"github.com/gin-gonic/gin"
	"github.com/joho/godotenv"
	"ironman-2021/app/config"
	"os"
)

func main() {
	envErr := godotenv.Load()
	if envErr != nil {
		panic(envErr)
	}

	port := os.Getenv("PORT")

	app := gin.Default()
	app.GET("/hc", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "health check",
		})
	})
	config.RouteUsers(app)
	err := app.Run(":" + port)
	if err != nil {
		panic(err)
	}
}
  • godotenv: 该套件能够直接在专案的目录底下侦测有无.env档案的存在,没有的话会出现 Error loading .env file 的错误,有的话则接下来就能读取.env之中的变数资料。

Summary

这章节我们做了许许多多未来後端开发的事前准备,像是下个章节解说gorm时所要用到的postgresql,以及所需吃到环境变数的godotenv等,这也让我们往後的开发事半功倍。

这章节的程序码也会放在下方连结~

https://github.com/Neskem/Ironman-2021/tree/Day-17


<<:  Day-18 EditText

>>:  Day23运算子(JavaScript)

高并发下的资料库状态

今天我们要来讨论高并发下的资料库考量 Day03_高并发下的资料库考量 ...

# 18 数据上的各种距离(3)

tags: tags: 2021IT #18数据上的各种距离(3) 夹角余弦(Cosine) 几何中...

Day05 - 纯 Html - 复杂型别 object + collection

object + collection 指的是 object 里面的某 Property 的资料型态...

Day26-好用的网页服务器-nginx(二)

前言 在昨天的文章介绍了 Nginx 的基本观念以及 Nginx container 的内部操作,今...

Day-12 Pytorch 介绍

机器学习的路上仍然需要撰写程序来达到我们期望的效果,在前面的文章中,我们已经介绍了从机器学习的基本...