- 投稿日:2020-02-22T04:57:16+09:00
Go で Docker の multi-stage build を試す
前提
- Docker がインストールされていること
手順
Go ファイルを作成
app.go
という名前のファイルを作成する。
app.go
に「Hello, world」と出力するだけのコードを書く。
(ホストOS に Go がインストールされてなくても )app.gopackage main import "fmt" func main() { fmt.Println("Hello, world") }Dockerfile を作成
Go ファイルと同じディレクトリに
Dockerfile
を作成する。
「Go のバイナリをビルドする環境」と「Go のバイナリを実行する環境」の定義を記述する。Dockerfile# 「builder」という名前で Dockerfile 内から参照できるようにする FROM golang:1.13 AS builder WORKDIR /root # 作成した Go ファイルをコピー COPY . /root # Linux 用のバイナリをビルドし、WORKDIR に出力 RUN GOOS=linux go build -o app . # scratch は超軽量なイメージ FROM scratch WORKDIR /root # 「builder」にあるバイナリを WORKDIR にコピー COPY --from=builder /root/app . CMD ["./app"]イメージをビルド & コンテナ起動
Go ファイルと Dockerfile があるディレクトリでターミナルを起動し、イメージをビルド & コンテナ起動する。
terminal# app という名前でイメージをビルド docker build -t app . # app のコンテナを起動( --rm はコンテナ停止時にコンテナを削除するオプション ) docker run --rm app # app.go の実行結果が出力される > Hello, world # app のイメージサイズ ≒ バイナリのサイズ で「Go のバイナリを実行する環境」が実現できたことがわかる docker images app --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}" REPOSITORY TAG SIZE app latest 2.01MB
- 投稿日:2020-02-22T00:36:17+09:00
GoをAWS Lambdaで動かす一番小さいサンプルメモ
前提
- Go 1.x
- ローカル環境でGoが動く
- デプロイは lambroll
- IAMロール作成済み
- 手元にAWSの認証情報がある
メモ
必要なパッケージのインストール
% go get -u github.com/aws/aws-lambda-go/lambda
コードの準備
hogehoge
をログ出力するだけ。引数も戻り値も考慮しない。hello.gopackage main // 一番最小限のLambda import ( "fmt" "github.com/aws/aws-lambda-go/lambda" ) func hello() { fmt.Println("hogehoge") } func main() { lambda.Start(hello) }ビルド
# hello バイナリが出来る % go build -o helloデプロイ準備
% lambroll init --function-name hello-go --region "ap-northeast-1function.json 更新
function.json{ "FunctionName": "[Function Name]", "Handler": "hello", "MemorySize": [MemorySize], "Role": "[Role ARN]", "Runtime": "go1.x", "Timeout": [Timeout Second] }デプロイ
% lambroll deploy --region "ap-northeast-1"あとはマネコン等で適当に実行
参考
AWS Lambda で Go が使えるようになったので試してみた | Developers.IO https://dev.classmethod.jp/cloud/aws/aws-lambda-supports-go/
Go の AWS Lambda 関数ハンドラー - AWS Lambda https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/go-programming-model-handler-types.html