2020-02-22に投稿

dockerで本番環境と開発環境を使い分ける方法いろいろ

よくあるよね。ちょうど今書いているプロダクトがいろいろ使っているので説明してみる

基本1:環境別のファイルを使う

希望:Dockerfile.developmentとDockerfile.productionみたいなのを用意して使い分けたい

docker build -f Dockerfile.development という具合にして指定することができる

http://docs.docker.jp/engine/reference/commandline/build.html

基本2:start.shで分岐

希望:毎回ファイルを指定するのめんどくさい。一個で実現できないの?

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-composeを使う

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
|-- (他にもプロダクトのファイルがいっぱい)

気にしなければいいと言えばいいのだけれど、服装の乱れは風紀の乱れ、プロジェクトの破綻はこういうところからやってくる!という感じで気になる人は、サブディレクトリに片付けよう

docker関連ファイルをサブディレクトリに配置する

ツイッターでシェア
みんなに共有、忘れないようにメモ

daisuke furukawa

おひるねのできるフリーランサー。「モバイラーズオアシス」の中の人でもあります。

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント