目的
AWSを利用した開発をする場合、localstackの利用するケースが多いと思います。
UnitTestもそのままlocalstackを利用できれば、より本番環境に近いテストができます。
ということで、やりたかったことは以下のようなもの。
そして、実際の業務の開発では、実環境で動作する前にローカルで確認したいことも多いとおもいます。
この構成をローカルで実行する場合は、一癖あるから注意してね、というのが本記事の趣旨とします。
前提
AWS CodeBuildをローカルで実行する環境は公式から公開されており、この手順でローカル実行を行っています。
実環境との差異
以下のようなdocker-compose.ymlを使ったとします。
docker-compose.yml
version: '3.8'
services:
app:
container_name: unittest
build:
context: .
dockerfile: Dockerfile
working_dir: /workspace
volumes:
- ./:/workspace
depends_on:
- "aws"
network_mode: service:aws
command: >
sh -c "
cd /workspace/local-template &&
sh deploy.sh &&
cd /workspace &&
chmod +x gradlew &&
./gradlew test
"
aws:
container_name: localstack
image: public.ecr.aws/localstack/localstack:latest
ports:
- "4566:4566"
buildspec.yml
version: 0.2
phases:
pre_build:
commands:
- docker-compose build
build:
commands:
- docker-compose run app
post_build:
commands:
- docker-compose down
これらは実際のCodeBuild上では問題なく動作します。
しかし、ローカル環境では動きません。問題となるは以下。
docker-compose.yml
volumes:
- ./:/workspace
docker-compose.ymlが存在するフォルダを/worksspaceへmountしたいだけなので、通常であれば間違った記述ではありません。
これで動作しない理由は、以下のIssueで議論されてるとおり、CodeBuildエージェント環境の場合、volumeがホスト側で解決されるためです。
解決方法
上記のIssueにもある通り、ホスト上のパスを指定することで動作するようになります。
docker-compose.yml
volumes:
- /home/senioris/app_folder:/workspace