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すればいけると思う。