AWSなら普通にECR(🔗https://aws.amazon.com/ecr/)を使うのが一般的です。
状況 #
サーバーのメモリに余裕がないので、サーバー上でdocker compose build
できない。
Dockerfileの中でプロジェクトのビルドなど、それなりにメモリを食う処理をするため。
ネット環境がない場所でのdeployの参考にもなるはず。
手順 #
- [ローカル] ローカルでイメージをビルドして、イメージを.tarへ保存
docker compose -f docker-compose.yml build --no-cache
docker save -o images.tar image1 image2 ...
images.tar
とdocker-compose.yml
をサーバーへアップロード
SSHを開通させたので、scpを使った- [サーバー] docker loadでイメージを取り込んで起動する
docker load -i images.tar
docker compose -f docker-compose.yml up -d
備考 #
- 今回使ったバージョン
$ docker compose version
Docker Compose version v2.35.1
- docker-compose.yml内の
service
で、自前のDockerfile
を
services:
server:
build:
context: ..
dockerfile: container/prod.Dockerfile
のように指定している場合は、そのファイルがないとdocker compose up
したときにエラーがでるので、それらもサーバーに配置しておく。(ちゃんとimageがloadされていればビルドはされないので、Dockerfileだけ配置しておけば良い。(Dockerfileの中で使っているファイルの配置などは必要なかった))
- docker-compose.yml内の
service
で外部の(hubなどの)imageを参照している場合、docker compose build
の段階でimageはpullされなかった
サーバー側でdocker compose up
した際に参照していたイメージがpullされた。
そのpullを防ぎたいのであれば、ローカルでその参照しているimageをdocker pull
して適切な名前とタグをつけて、docker save
して同様にサーバー側でdocker load
すればいけると思う。