Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Qall - Development env on Docker for Quipper

Qall - Development env on Docker for Quipper

Rails Developers Meetup 2018 Day 2 発表資料

https://railsdm.github.io/2018/

Fumiaki MATSUSHIMA

March 25, 2018
Tweet

More Decks by Fumiaki MATSUSHIMA

Other Decks in Programming

Transcript

  1. ➔ API + フロント + ワーカー + etc… を各アプリ毎に ➔

    単機能の開発だと全部は要らないことが多い ◆ あまり改修が入らないところのセットアップが 後回しにされがち ◆ 障害調査などとっさの時に困る システム全体の構成要素は増え続ける
  2. ➔ 各リポジトリには Docker 固有のファイルを(ひとまず)持たない ◆ 最小公倍数的な Dockerfile を 1 つ

    ◆ 違うところは build arg で回避 ➔ 各リポジトリは qall 上に clone してくる Qall の基本方針
  3. qall |----- Dockerfile |----- docker-compose.yml |----- repos | |----- student-api

    | |----- student-front | |----- ... |----- envs |----- student-api.env |----- student-front.env |----- ... 各リポジトリ 各リポジトリ毎の ローカル用環境変数
  4. macOS Docker CLI $ dc run app rails s $

    alias dc=docker-compose
  5. Hypervisor Framework (VM) Linux Docker Container Engine macOS Docker CLI

    $ dc run app rails s $ alias dc=docker-compose
  6. Hypervisor Framework (VM) Linux OSXFS Docker Container Engine macOS Rails

    gem rails s Docker CLI $ dc run app rails s $ alias dc=docker-compose
  7. Hypervisor Framework (VM) Linux OSXFS Docker Container Engine macOS Rails

    gem rails s Docker CLI R/Wがすごく遅い $ dc run app rails s $ alias dc=docker-compose
  8. Docker Container Engine macOS Docker CLI docker-sync OSXFS app gem

    app gem /host_sync app gem /app_sync Unison で同期 $ docker-sync start
  9. Docker Container Engine macOS Docker CLI docker-sync OSXFS app gem

    app gem /host_sync app gem /app_sync $ dc run app rails s $ alias dc=docker-compose
  10. Docker Container Engine macOS rails s Docker CLI docker-sync OSXFS

    app gem app gem /host_sync app gem /app_sync $ dc run app rails s $ alias dc=docker-compose
  11. Docker Container Engine macOS rails s Docker CLI docker-sync OSXFS

    app gem app gem /host_sync app gem /app_sync 遅い 速い $ dc run app rails s $ alias dc=docker-compose
  12. Docker Container Engine macOS rails s Docker CLI docker-sync OSXFS

    app gem app gem /host_sync app gem /app_sync なぜか死ぬことがある
  13. Hypervisor Framework (VM) Linux Docker Container Engine macOS rails s

    $ dc run app rails s Docker CLI BUNDLE_PATH を Volume に gem app Gem 以外は諦める OSXFS $ alias dc=docker-compose
  14. ➔ vendor/bundle、tmp、node_modules とか ◆ sprockets 使っているときは tmp がよく効く ➔ ディレクトリがないところに

    mount すると所有者が root に なってしまうため、Rails コマンドなどを実行するユーザとして Dockerfile 内で予め作っておく R/W が多いところは Volume に
  15. Dockerfile の例 ARG QALL_REPO_NAME ARG QALL_MOUNT_DIRS RUN mkdir -p /quipper/$QALL_REPO_NAME

    && \ cd /quipper/$QALL_REPO_NAME && \ (test -z "$QALL_MOUNT_DIRS" || mkdir -p $QALL_MOUNT_DIRS) && \ chown -R quipper:quipper /quipper
  16. ➔ Bash とか Pry とかのヒストリバックが C-p のあとに何か押さないと動かない ➔ C-p C-q

    が Docker のデフォルトのデタッチキーバインド ◆ Docker CLI なら config.json で上書きできるが、 Docker Compose だと config.json を見ない... Compose 介すと C-p が動かない
  17. ➔ このリポジトリには mongo と pg と redis と memcached 、こっちは

    redis は要らなくて... ◆ リポジトリ毎に欲しくなるミドルウェアと、それに対応した環境変数を 都度書くのがめんどくさすぎる 複雑化する docker-compose.yml
  18. api: ruby_version: 2.5.0 nodejs_version: 6.13.1 commands: default: bundle exec rails

    s -b 0.0.0.0 worker: bundle exec rake resque:start depends_on: [mongo, redis] mount_dirs: [tmp] こんな感じの YAML を元にする Build args に 各々 service と command に Build args に リポジトリ単位の service に
  19. services: api: &api container_name: qall-api command: bundle exec rails s

    -b 0.0.0.0 build: context: . args: RUBY_VERSION: 2.5.0 NODEJS_VERSION: 6.13.1 QALL_REPO_NAME: api QALL_MOUNT_DIRS: tmp working_dir: /quipper/api volumes: - vendor:/vendor - home:/home/quipper - ./repos:/quipper:cached - tmp-api:/quipper/api/tmp environment: BUNDLE_PATH: /vendor/bundle/2.5.0 MONGODB_HOST: mongo REDIS_URL: redis://redis-api env_file: - envs/common.env - envs/api.env depends_on: [mongo, redis-api] tty: true stdin_open: true api-worker: <<: *api container_name: qall-api-worker command: bundle exec rake resque:start mongo: container_name: qall-mongo image: mongo volumes: - mongo-data:/data/db redis-api: container_name: qall-redis-api image: redis:alpine yaichi: container_name: qall-yaichi image: mtsmfm/yaichi ports: - 80:3000 volumes: - /var/run/docker.sock:/var/run/docker.sock volumes: home: mongo-data: vendor: tmp-api:
  20. ➔ 本番 (Deis) と同じイメージに ➔ 各リポジトリ毎に Dockerfile を ➔ 個々人で

    docker build せずに pull する構造に ➔ docker-compose やめて k8s に移行 ◆ helm? Qall の課題
  21. ➔ letter_opener ◆ コンテナ上にブラウザがいない ➔ ChromeDriver による E2E テスト ◆

    コンテナ上にブラウザがいない 今まで通りでは動かなくなるが 解決策があるもの
  22. ➔ save_and_open_page ◆ スクショ.png を ホストに見えるところに置けば開けるが... ➔ bundle open ◆

    Gem はホストにない ◆ エディタはホストにある 今までのように動かなくなるもの