AWS CodeBuild を高速化するためのTips
ビルド職人の朝は早い、、、
というわけで、前回に続きでCodeBuildのノウハウです。
CodeBuildに限った話じゃないものもありますし、Docker使う場合だけの話もあります。ちゃんと計測したわけではないので、軽く試してみて良かったら使うくらいのノリでお願いします。
CodeBuildのキャッシュをうまく使う
Dockerのキャッシュをうまく使う
オフィシャルのドキュメントに色々書いてあるのですが、一例を、、
↑に関連してですが、例えば、以下のような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処理の高速化とコンテナサイズの縮小が望めます。
まとめ
公式ドキュメントをよく読むと色々ノウハウが載ってます。ログと合わせて、ちゃんと読むと色々対応方法がありそうです。