Golang Command Line Flags 와 Docker Env

go 로 api server 를 개발하는데, spring 의 spring.profiles.active 처럼 환경에 맞게 deploy 처럼 할 수 있는 방법 정리

https://mingrammer.com/gobyexample/command-line-flags/

command line flsgs

말 그대로 커맨드 라인에 플래그 값을 주면 코드에서 받아서 사용하는 방법이다.

go build command-line-flags.go

./command-line-flags -word=opt -numb=7 -fork -svar=flag
word: opt
numb: 7
fork: true
svar: flag
tail: []

./command-line-flags -word=opt
word: opt
numb: 42
fork: false
svar: bar
tail: []

./command-line-flags -word=opt a1 a2 a3
word: opt
...
tail: [a1 a2 a3]

./command-line-flags -word=opt a1 a2 a3 -numb=7
word: opt
numb: 42
fork: false
svar: bar
tail: [a1 a2 a3 -numb=7]

./command-line-flags -h
Usage of ./command-line-flags:
  -fork=false: a bool
  -numb=42: an int
  -svar="bar": a string var
  -word="foo": a string

example code

package main

import "flag"
import "fmt"

func main() {
	wordPtr := flag.String("word", "foo", "a string")
	numbPtr := flag.Int("numb", 42, "an int")
	boolPtr := flag.Bool("fork", false, "a bool")

	var svar string
	flag.StringVar(&svar, "svar", "bar", "a string var")
	flag.Parse()
	fmt.Println("word:", *wordPtr)
	fmt.Println("numb:", *numbPtr)
	fmt.Println("fork:", *boolPtr)
	fmt.Println("svar:", svar)
	fmt.Println("tail:", flag.Args())
}

Dockerfile

도커파일에서는 아래와 같은 방법으로 command line flsgs 를 전달할 수 있다.

FROM golang:onbuild
ENTRYPOINT ["/go/bin/app", "-name=foo", "-title=bar"]

실제 활용

위의 두가지 방법을 조합해서 실제로 사용해보자.

Deployment.yaml

container 의 env 로 profile 값을 정한다.

spec:
      containers:
          env:
            - name: profile
              value: dev

Dockerfile

dockerfile 에서는 위에 정한 변수를 받아서 사용하게 설정하면 된다.

FROM golang:onbuild
ENTRYPOINT ["/go/bin/app", "-profile=${profile}"]