LoginSignup
18
20

More than 5 years have passed since last update.

docker コンテナ上で Go のアプリケーションを開発しはじめるときの自分のやり方

Last updated at Posted at 2017-01-31

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.jsonmanifest.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 は自動で足りないディレクトリを順に作ってくれるはずだからわざわざ事前に作らなくても...

おー、無知ですみません。修正しました。

18
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
20