もやぶろ

moyashidaisukeのブログだからもやぶろ。フリーランスのエンジニアのダイスケです。QOLあげて色々楽しくチャレンジして良く生きたい。プログラム関連とかギター関連とか旅行関連とか色々。

AWS CodeBuild を高速化するためのTips

ビルド職人の朝は早い、、、

というわけで、前回に続きでCodeBuildのノウハウです。

CodeBuildに限った話じゃないものもありますし、Docker使う場合だけの話もあります。ちゃんと計測したわけではないので、軽く試してみて良かったら使うくらいのノリでお願いします。

CodeBuildのキャッシュをうまく使う

moyashidaisuke.hatenablog.com

Dockerのキャッシュをうまく使う

オフィシャルのドキュメントに色々書いてあるのですが、一例を、、

docs.docker.com

↑に関連してですが、例えば、以下のようなDockerFileがあったとします。

FROM nginx:alpine

# ソースコードをコンテナにコピー
COPY app /var/www

# 設定ファイルをコピー
COPY docker/nginx/nginx.conf /etc/nginx/


# 色々インストール
RUN apk update \
    && apk upgrade \
    && apk add --no-cache openssl \
    && apk add --no-cache bash \
    && adduser -D -H -u 1000 -s /bin/bash www-data


ADD ./docker/nginx/startup.sh /opt/startup.sh
RUN sed -i 's/\r//g' /opt/startup.sh
CMD ["/bin/bash", "/opt/startup.sh"]

EXPOSE 80 443

Dockerのcacheは上から順番にしていって、差分が発生せいた時点で以降はすべてcacheが無効になります。この場合だと、 COPY app /var/www がほとんどの場合前回と差分があるはずなので(ファイルのchecksumで差分扱いにしてくれる)、以降はcacheが効かなくなります。

なので、こんな感じで差分が発生しなさそうな処理をできるだけ最初の方に(逆に言うと差分が発生しそうな処理はできるだけ後の方に)やるとcacheが効きやすくなります。

FROM nginx:alpine


# 設定ファイルをコピー
COPY docker/nginx/nginx.conf /etc/nginx/


# 色々インストール
RUN apk update \
    && apk upgrade \
    && apk add --no-cache openssl \
    && apk add --no-cache bash \
    && adduser -D -H -u 1000 -s /bin/bash www-data

# ソースコードをコンテナにコピー
COPY app /var/www


ADD ./docker/nginx/startup.sh /opt/startup.sh
RUN sed -i 's/\r//g' /opt/startup.sh
CMD ["/bin/bash", "/opt/startup.sh"]

EXPOSE 80 443

alipneを使う

軽いは正義(ダウンロード、アップロードの速度、メモリ、ECRのストレージ等、色々効いてくる)なので、alpineを使ってなければalpineに変更しましょう。

でもalpineは色々ライブラリが入ってなかったりで、切り替えるのはけっこう面倒だったりします、、、

docker-compose build --parallel を使う

もしdocker-compose を使っていて複数コンテナを扱っているのであれば、parallelオプションを試してみましょう。 複数コンテナのbuildを並列でやってくれます。

.dockerignoreを使う

.dockerignoreファイルを使うと、COPYする時に不要なフォルダを除外できます。node_modulesとかvendorとかが不要なコンテナの場合は、COPY処理の高速化とコンテナサイズの縮小が望めます。

まとめ

公式ドキュメントをよく読むと色々ノウハウが載ってます。ログと合わせて、ちゃんと読むと色々対応方法がありそうです。