目標
SpringBoot+MongoDBなアプリケーションをDockerで起動するサンプルを作る。
リポジトリ
構築
docker-compose.yml
docker-compose.yml
version: '3.1'
services:
mongo:
image: mongo:latest
volumes:
- ./mongodb/data/db:/data/db
- ./docker-entrypoint-initdb.d/:/docker-entrypoint-initdb.d/
command: ["mongod", "--smallfiles", "--logpath=/dev/null"]
example-application:
build: ./
image: iwanagat85:example-application
volumes:
- ./logs:/app/logs
ports:
- 8080:8080
depends_on:
- mongo
restart: always
links:
- mongo
Dockerfile
- MongoDBの立ち上がりまでアプリの起動を待つためにDocker公式に書いてあったスクリプトを参考に。
- Gradleで
./build/libs
にスクリプトをコピーする方法も考えたけど、RUNで出力するほうが性に合った。
Dockerfile
FROM openjdk:8-jdk-alpine
WORKDIR /app
COPY ./build/libs /app
RUN : "make wait.sh" && { \
echo "#!/bin/sh"; \
echo "# wait.sh"; \
echo ""; \
echo "set -e"; \
echo "HOST_NAME=\${1}"; \
echo "host=\${HOST_NAME%:*}"; \
echo "port=\${HOST_NAME#*:}"; \
echo "shift"; \
echo ""; \
echo "cmd=\"\$@\""; \
echo ""; \
echo "while !(nc -z \${host} \${port}) ; do"; \
echo " echo \"Waiting \${host}:\${port} to initialize...\""; \
echo " sleep 2"; \
echo "done"; \
echo ""; \
echo ">&2 echo \"Executing command: \${cmd}\""; \
echo "exec \${cmd}"; \
} | tee /app/wait.sh
CMD ["sh", "wait.sh", "mongo:27017", "java", "-jar", "spring-boot-docker-1.0.0-SNAPSHOT.jar"]
build.gradle
- Gradleでイメージの作成を行う。
- 最初はDocker内でclone→buildしてみたけど、イメージのサイズが信じられないくらい膨れ上がったので止め。
-
--no-cache
や--force-rm
を入れてもいい。
task execDockerCompose(type: Exec) {
commandLine 'docker-compose', 'build', '--force'
}
task buildDockerImages(group: 'build', type: GradleBuild) {
tasks = ['clean', 'build', 'bootJar', 'execDockerCompose']
}
ディレクトリ構成
.
├── .dockerignore
├── .gitignore
├── Dockerfile
├── build.gradle
├── docker-compose.yml
├── docker-entrypoint-initdb.d
│ └── init.js
├── gradle
├── gradle.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
└── src
├── main
└── test
実行
$ ./gradlew buildDockerImages
$ docker-compose up
その他
- 開発中は
mongo
をhosts
に127.0.0.1
として登録して、mongoだけ立ち上げていた。 - もっと他に良い方法がありそう。