docker コンテナ上で Go のちょっとした Web アプリを開発する機会があったのでメモしておく。
さいきん出た Go 公式の依存解決ツールである dep も使ってみた。
準備
$ mkdir sampleapp/
$ cd sampleapp/
Dockerfile 作成。
$ vi Dockerfile.dev
$ cat Dockerfile.dev
FROM golang
WORKDIR ${GOPATH}/src/github.com/tily/sampleapp
RUN apt-get update -y && apt-get install -y vim
RUN go get -u github.com/golang/dep/...
コンテナ起動用のシェルスクリプト作成。
$ vi docker-dev.sh
$ cat docker-dev.sh
docker build -f Dockerfile.dev -t sampleapp:dev .
docker run -ti --rm \
-v $(pwd):/go/src/github.com/tily/sampleapp \
--name sampleapp-dev sampleapp:dev bash
コンテナ起動~開発
作成したシェルを起動すると、コンテナに bash でログインされる。
$ sh docker-dev.sh
Sending build context to Docker daemon 18.43 kB
(略)
Successfully built da293a7c17fb
root@d53ab76aac81:/go/src/github.com/tily/sampleapp#
外部パッケージを参照したプログラムを書いてみる。
$ vi main.go
$ cat main.go
package main
import (
"fmt"
"github.com/tily/gostrcrypt"
)
func main() {
key := "CAFEBABECAFEBABE"
sc := gostrcrypt.StrCrypt{key}
plaintext := "hello, world"
encrypted, err := sc.Encrypt(plaintext)
if err != nil {
panic(err)
}
decrypted, err := sc.Decrypt(encrypted)
if err != nil {
panic(err)
}
fmt.Println(decrypted) // => "hello, world"
}
dep init すると、lock.json
と manifest.json
というファイルが作成される。
root@d53ab76aac81:/go/src/github.com/tily/sampleapp# dep init
root@d53ab76aac81:/go/src/github.com/tily/sampleapp# cat lock.json
{
"memo": "db8cc0465eded21abba07d6f57dfae31577fa51c7f7fc356b50f9f09044b0715",
"projects": [
{
"name": "github.com/tily/gostrcrypt",
"branch": "master",
"revision": "a03ae0a7729ca39026fb25d7c51b44db53b375a5",
"packages": [
"."
]
}
]
}
root@d53ab76aac81:/go/src/github.com/tily/sampleapp# cat manifest.json
{}
dep ensure すると、vendor/
配下に依存しているパッケージが保存される。
# dep ensure
root@d53ab76aac81:/go/src/github.com/tily/sampleapp# dep ensure
root@d53ab76aac81:/go/src/github.com/tily/sampleapp# ls vendor/github.com/tily/gostrcrypt/
README.md gostrcrypt.go gostrcrypt_test.go
依存関係を解決して go run できるようになっている。
root@d53ab76aac81:/go/src/github.com/tily/sampleapp# go run main.go
hello, world
開発を終えてコンテナを終了
ボリュームマウントしてあるので、コンテナを終了してもファイルの変更はホスト側に反映されている。
root@d53ab76aac81:/go/src/github.com/tily/sampleapp# exit
exit
$ ls
docker-dev.sh Dockerfile.dev lock.json main.go manifest.json vendor
とりあえずこんな感じかなー。
追記 (2017/02/01)
はてブコメントをいただいていたので返信しておきます。
http://b.hatena.ne.jp/fn7/20170131#bookmark-318703480
docker使うメリットはなんだろ
ホスト側の環境を汚さずに何度でも作ったり壊したりできる開発環境が用意できるところじゃないですかねー。
http://b.hatena.ne.jp/mapk0y/20170131#bookmark-318703480
WORKDIR は自動で足りないディレクトリを順に作ってくれるはずだからわざわざ事前に作らなくても...
おー、無知ですみません。修正しました。