12
11

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-10-04

ルートに置くファイル多すぎだよね

README、LICENSE、Rakefile、config.ru、GemfileにGemfile.lock、.envrc あたりまでは、まあしょうがないかな、と思っていたのですけど。.rspec、circle.yml、Guardfileあたりからちょっと気になりはじめて。

Dockerfile、docker-compose.yml、start.sh。docker起動用のシェルスクリプトなんかもrootにおいちゃったりなんかすると、ちょっと片付けようよ:anger:という気がしてきません?

そういうことが気になる、きれい好きな人のためのエントリです。

やりたいこと

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に書く程度にとどめておきましょう:smiling_imp:

12
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
11