--

[Go Lang] How to run go application in docker with flags

https://www.getwrecked.com/category/technology/golang-technology/

flag เป็น package ของ go ที่ใช้สำหรับกำหนด parameter ในขณะที่จะ execute application สามารถดูคุณสมบัติได้จาก https://golang.org/pkg/flag/ และทดลองใช้ได้จาก https://gobyexample.com/command-line-flags

ดูแล้วก็ไม่น่าะมีปัญหาอะไร ถ้าเราพัฒนา application ของเราแล้วให้ผู้ใช้เรียกผ่าน command line โดยระบุ parameter ที่เป็น flag ต่อท้าย

แต่ความสนุกมันเกิดขึ้นตอนที่เราอยากให้ application ของเราไปอยู่ใน containner นี่ละ ซึ่งปกติ เราก็ใช้ docker build เพื่อสร้าง image ของ application เรา แล้วก็สั่ง run ด้วย docker run <image> แต่ เออ เราไม่เคยใส่ parameter ตามท้ายเลยนะ ปกติเราก็ใช้วิธีประกาศตัวแปรเป็น environment แล้วก็ได้ใช้ os.Getenv เอามาใช้

มาลองกัน

เริ่มจากสร้าง application ที่ใช้ flag จาก go by example

package mainimport ("flag""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 stringflag.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())}

go run main.go ก็จะได้ตามตัวอย่างใน go by example ถึงตอนนี้ก็ควรจะ go build เป็น binary สักครั้ง แล้วลอง run binary with parameter ดูอีกที เพื่อให้มั่นใจว่า เราสามารถเรียกใช้ application นี้แบบมี parameter flag ได้

./myflag -word=peter -numb=88 -fork -svar=someone
word: peter
numb: 88
fork: true
svar: someone
tail: []

ถัดไป ถึงเวลาจัดใส่ docker image ละนะ เริ่มด้วยเตรียม Dockerfile จากตัวอย่าง

FROM golang:1.13-alpine as builderRUN apk add --no-cache --virtual .build-deps \bash \gcc \git \musl-devRUN mkdir buildCOPY . /buildWORKDIR /buildRUN go getRUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -ldflags '-extldflags "-static"' -o myflag main.goRUN adduser -S -D -H -h /build myflagUSER myflagFROM scratchCOPY --from=builder /build/myflag /app/WORKDIR /appENTRYPOINT ["./myflag"]

จากนั้นก็ docker build -t <my image:tag> . ก็จะได้ image ที่หมาย

มาลอง run กัน

docker run --rm myflag:latest -word=happy -numb=99 -fork -svar=myname
word: happy
numb: 99
fork: true
svar: myname
tail: []

หวังว่าคงเข้าใจกันนะ ขอให้มีความสุขกับการ code

reference

https://marcofranssen.nl/docker-tips-and-tricks-for-your-go-projects/

--

--