ルートに置くファイル多すぎだよね
README、LICENSE、Rakefile、config.ru、GemfileにGemfile.lock、.envrc あたりまでは、まあしょうがないかな、と思っていたのですけど。.rspec、circle.yml、Guardfileあたりからちょっと気になりはじめて。
Dockerfile、docker-compose.yml、start.sh。docker起動用のシェルスクリプトなんかもrootにおいちゃったりなんかすると、ちょっと片付けようよという気がしてきません?
そういうことが気になる、きれい好きな人のためのエントリです。
やりたいこと
dockerディレクトリを作ってDocker関連のファイルを全部収めたい
サブディレクトリを作って、コンテナごとに必要なファイルはそのディレクトリに入れるイメージです
app
bin
config
db
docker
└ docker-compose.yml
└ app
└ Dockerfile
└ start.sh
└ nginx
└ nginx.conf
:
lib
docker-compose.yml
version: '2'
services:
db:
image: postgres
app:
build:
context: ../
dockerfile: docker/app/Dockerfile
volumes:
- .:/app
ports:
- "3000:3000"
depends_on:
- db
links:
- db:db
environment:
RAILS_ENV: development
build: docker/app/Dockerfile
みたいに直接ファイルを指定するやり方だとなかなかうまく行きません。
context: ../
という具合に、 build contextを指定することで、docker関連のコマンドのカレントディレクトリがproject_rootになるので、Gemfileをコピーしようとしたらfile not foundになるみたいなトラブルを回避することができます。
Compose file reference / build
app/Dockerfile
FROM ruby:2.3
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
postgresql-client \
&& rm -rf /var/lib/apt/lists/*
RUN mkdir -p /app
WORKDIR /app
ADD Gemfile /app/
ADD Gemfile.lock /app/
RUN bundle install -j4
CMD ["sh", "/app/docker/app/start.sh"]
このへんはプロジェクトごとに色々あるかと思いますが、build contextさえ指定してあれば、ホスト側のディレクトリはproject_rootを基準にかく事ができるのでわかりやすくなります。
起動
project_rootで
$ docker-compose -f docker/docker-compose.yml up
という具合に docker-compose.yml を指定して起動することができます。
引数を覚えておくのが面倒くさいからと言ってシェルスクリプトをproject_rootにおいたりすると本末転倒なので、そういうのはREADMEに書く程度にとどめておきましょう