新米Webエンジニアのhiroさんです。
個人開発アプリをDockerでコンテナ化したので記事にします。
GitHub - env-gp/motoprize
Dockerfile、docker-compose.ymlのたたき台を作成
※ 学習も兼ねているため、コメントを多用しています
Dockerfile
#ベースイメージを指定。必須項目 FROM ruby:2.5.1 # RUN命令は1命令ごとに1イメージを作成する # イメージをまとめるためにRUN命令はできるだけまとめる # postgresql-clientのインストール # パッケージインデックスファイルの削除 RUN apt-get update -qq \ && apt-get install -y --no-install-recommends \ postgresql-client \ && rm -rf /var/lib/apt/lists/* # build-essential、nodejsのインストール RUN apt-get update -qq && apt-get install -y \ build-essential \ nodejs \ && rm -rf /var/lib/apt/lists/* # Bundlerのインストール RUN gem install bundler # イメージ内にappディレクトリを作成して作業ディレクトリにする WORKDIR /app # Gemfile, Gemfile.lockをイメージのappディレクトリにコピーしてbundle install ADD Gemfile Gemfile ADD Gemfile.lock Gemfile.lock RUN bundle install # ホスト上のカレントディレクトリファイルをイメージのカレントディレクトリにコピー ADD . .
docker-compose.yml
#docker-composeのバージョン version: '3' services: db: image: postgres ports: - '5432:5432' # ホストからゲストへポートフォワード volumes: - postgresql-data:/var/lib/postgresql/data # 永続化のためホストにボリュームを保存 rails: build: context: . dockerfile: Dockerfile command: bundle exec rails s -p 3000 -b '0.0.0.0' tty: true stdin_open: true depends_on: - db # DB側のコンテナが出来上がってからrailsを実行 ports: - "3000:3000" # ホストからゲストへポートフォワード volumes: - .:/app # コード変更したらDocker側も即反映 volumes: postgresql-data: driver: local
database.yml
docker-compose.ymlのサービス名を追記
default: &default adapter: postgresql encoding: unicode host: db
You must use Bundler 2 or greater with this lockfile.
が発生
docker-compose build
を行うと以下のエラーとなった。
You must use Bundler 2 or greater with this lockfile.
2.5.1から2.6.2にバージョンアップして解決
rubyのバグのようなので対応済みの2.6.2に上げる。
- Dockerfileのベースイメージを
FROM ruby:2.6.2
に変更 - Gemfileのrubyバージョンを
ruby '2.6.2'
に変更
以下のコマンドを実行
docker-compose build # イメージを作成 docker-compose up # イメージからコンテナを起動 docker exec -it motoprize_rails_1 /bin/bash # コンテナにログイン # コンテナ内でcreate、migrate、seedを実行 bin/rails db:create bin/rails db:migrate bin/rails db:seed
Autoprefixer doesn’t support Node v4.8.2. Update it
エラーが発生
http://localhost:3000/にアクセスしたところ、以下のエラーとなった。
Node.js v10.xをインストールして解決
- nodejsが古いようなのでNode.js v10.xをインストールする。Dockerfileを以下を追記
RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - \ && apt-get install -y nodejs
再度アクセスするとエラーは解消され、ブラウザ上での動作確認は問題ありませんでした。 が、SystemSpecが全滅で大量にエラーが出ました。 ここからどハマりしてしまい、タイムアップとなってしまったのでまたの機会にさせてください。。
所感
今回、Dockerを網羅的に学んだわけではないですが、まずは手を動かしてみることが大事なのでトライしてみました。
これで実践レベルのDockerfile、docker-compose.ymlも多少は読めるようになりました。
まだまだ改良の余地があるので改善していこうと思います。
今後は下記のタスクを実行していきます。
- コンテナ上でSystemSpecが実行できるようにする
- どこかのレンタルサーバーでproduction環境をコンテナで構築する。nginxイメージも追加する。
Dockerはとても便利ですが、個人開発の場合はあまり恩恵ないですね〜