Go
docker
alpine

alpineコンテナでgoバイナリを定期実行するDockerflie

初めに

goバイナリを、alpineのDockerイメージの中にポイして、安定して動くようになったので記事にしました。
既にalpineイメージの中でgoバイナリを動かす過程で嵌った記事は幾つかあり、参考にさせて頂くと同時に助かりました。
参考にした記事は、最後に記載しております。
上記に加えてJST時刻設定と定期実行させるためのクーロン設定をDockerfileに追加してみました。

Dockerfile

githubで公開しております。

07行目の箇所は、goのtimeパッケージを使用する際に必要となります。
cron設定は、cron設定ファイルを直接crontabs以下にコピーしています。(詳しくは、上記のgithubのソース参照)

Dockerfile
01 FROM alpine:3.4
02 WORKDIR /app
03 
04 # goバイナリを動かす設定
05 RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2
06 RUN apk add --no-cache ca-certificates
07 ADD https://github.com/golang/go/raw/master/lib/time/zoneinfo.zip /usr/local/go/8 lib/time/zoneinfo.zip
08 
09 # JST時刻設定
10 RUN apk --update add tzdata && \
11     cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
12     apk del tzdata && \
13     rm -rf /var/cache/apk/*
14   
15 # バイナリのコピー
16 COPY hello /app
17 
18 # cron設定
19 COPY ./cronenv/root /var/spool/cron/crontabs/root
20 CMD ["crond", "-f", "-d", "8"]

参考記事

goバイナリを動かす設定関連

Docker で Go で作ったバイナリを実行するなるべく小さいコンテナを作る
Dockerのbusybox内でgolangのtimeを使ったらエラーになった

JST時刻設定

Alpine Linux でタイムゾーンを変更する

最後に

AWSのCodePipelineを使用して、上記のようなイメージをビルド・ECRへのPush・EC2へのデプロイをしています。
次回はそれについて書けたらと思います。