dev環境とprod環境で別のDockerfile使うってできるのかなdev環境ではホットリロードしたいからspring-boot:runで動かしてるけど,本番は実行可能jarにして動かしたい🐳
— ysek (@uuusu_) January 25, 2020
よくあるよね。ちょうど今書いているプロダクトがいろいろ使っているので説明してみる
希望:Dockerfile.developmentとDockerfile.productionみたいなのを用意して使い分けたい
docker build -f Dockerfile.development という具合にして指定することができる
http://docs.docker.jp/engine/reference/commandline/build.html
希望:毎回ファイルを指定するのめんどくさい。一個で実現できないの?
Dockerfileじゃなくて、最後に起動するstart.sh的なファイルの中なら、シェルスクリプトだから何だって書ける。
Dockerfile
:
CMD ["sh", "start.sh"]
start.sh
:
if [ "$NODE_ENV" = "development" ]
then
# develop環境の処理
else
# それ以外の処理
fi
冒頭の用途ならこれで十分な気がする。javaは知らないけど、たぶんdevとかprodcutionを指定する環境変数みたいなのはあるよね。
ただ、何でもかんでもstart.shにいれると、docker layer cacheが効かなくなってbuildの重いコンテナになってしまう。ライブラリのインストールみたいに重たい処理を切り替えたいときはDockerfileから分けたほうが良い。
dockerと使い分けがよくわからないDocker-composeだけど、ちゃんと使うといろいろ便利な機能がある。ビルドするファイルを環境変数で指定できるのもその一つ
docker-compose.production.yml
rails:
build:
dockerfile: docker/Dockerfile.production
こんな感じでproduction用のdocker-composeファイルを用意して
export COMPOSE_FILE=docker/docker-compose.development.yml
こんなふうに環境変数でファイルを指定しておけば、普段は、 docker-compose build
という具合に、特に意識せずに使うことができる
buildとかrun程度の普段の用事ならdocker-composeで全部できるので、使い分けのことはあまり考えずに過ごせる。
この手の使い分けをすると、プロジェクトのルートディレクトリにやたらとファイルが散逸する問題が起きる
|-- README.md
|-- .circleci
|-- deploy.sh
|-- docker-compose.development.yml
|-- docker-compose.production.yml
|-- Dockerfile.development
|-- Dockerfile.production
|-- .env
|-- (他にもプロダクトのファイルがいっぱい)
気にしなければいいと言えばいいのだけれど、服装の乱れは風紀の乱れ、プロジェクトの破綻はこういうところからやってくる!という感じで気になる人は、サブディレクトリに片付けよう
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント