Edited at

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へのデプロイをしています。

次回はそれについて書けたらと思います。