Dockerの導入!

ポートフォリオにDockerを導入した話

今回、紙の本で読書をしたときのメモを整理するオリジナルアプリを作成しました。本番環境にAWSを導入したあとに開発環境にDockerを導入しました。この記事ではDockerを導入するために記述したコードとどこで詰まったのかについて述べていきます。

具体的なコード

#ベースイメージを取得
FROM ruby:2.6.5

#コンテナ内で必要なコマンドをインストール
RUN apt-get update && \
    apt-get install -y mariadb-client nodejs vim --no-install-recommends && \
    rm -rf /var/lib/apt/lists/*

#reaading_memoというディレクトリを作成して基点にする
RUN mkdir /reading_memo

WORKDIR /reading_memo

#Gemfileをコンテナにコピーし、bundle installを実行
ADD Gemfile /reading_memo/Gemfile
ADD Gemfile.lock /reading_memo/Gemfile.lock

RUN gem install bundler
RUN bundle install

#ローカルのディレクトリをコンテナにコピー
ADD . /reading_memo

ADDよりCOPYを使ったほうが良い。これはImageサイズとセキュリティの観点から言えることらしい。そのためADDをCOPYに変えて記述し直すつもりです。

version: '3.7'
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: root
    volumes:
      #データの永続化のために必要
      - mysql-data:/var/lib/mysql                                                               
    ports:
      - "4306:3306"

  app:
    #コンテナ上でbinding.pryするために必要
    tty: true                                                         
    #コンテナ上でbinding.pryするために必要                                         
    stdin_open: true                                                                                   
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      #ローカルのディレクトリをコンテナ上にマウント
      - .:/reading_memo          
      #bundle installした後buildし直す必要がなくなる                                                                  
      - bundle:/usr/local/bundle                                                                  
    ports:
      - "3000:3000"
    links:
      - db
    environment: 
      - AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      - AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY

volumes:
  mysql-data:
  #bundle installした後buildし直す必要がなくなる
  bundle:                                                                                                    
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password
  socket: /tmp/mysql.sock

development:
  <<: *default
  database: reading_memo_development
  #作成したdbコンテナと接続するため(この記述がないとsocket通信でDBと接続してしまい、作成したdbコンテナの意味がなくなる)
  host: db

以下省略

passwordとusernameは任意

実行コマンド

docker-compose build 
docker-compose up -d
docker-compose exec app bundle exec rails db:create
docker-compose exec app bundle exec rails db:migrate

詰まったところ

コンテンを起動してからhttp://localhost:3000/に接続してもつながらない。

確証はないが、docker-compose exec web bundle exec rails db:createをターミナルで実行したら解決できたと思う。その他にもDockerfile、docker-compose.ymlまたはdatabase.ymlなどの記述を見直した。

データを保存できない

ターミナルでdocker-compose exec web bundle exec rails db:migrateを実行した。このコマンドを実行していなかったため、テーブルが作成されておらずエラーが出たと考えている。

環境変数を設定していない

画像を保存するときにAWSのS3に保存しているが、そこに保存するための環境変数をコンテナ内に持ち込んでいなかったことが原因。.envファイルに環境変数を記述し、解決した。

.envファイルをGitHubへのpush対象から外す

GitHubに変更を反映するためにpushしようとしたが、.envファイルはpushできないと表示された。そのため、.gitignoreに/.envを記述し対象外にしようとしたが、反映されなかった。そこで下記のコードを実行し、.gitignoreの内容が反映されるようにした。

git rm -r --cached .
git add .
git commit -m "コミット名"

開発環境にDockerを導入してみて

初めてのことだったので、結構時間がかかった。ほぼ一週間かかったかもしれない。ただ、今回やったおかげでDockerがどういうものか多少はわかった。得体の知れないものではなくなったことが何よりの収穫。これからも時間はかかるだろうが粘り強くやっていきたい。
今回まとめていて思ったが、エラーの内容とかはきっちりとメモとかにまとめておいたほうが良い。何をしてどんなエラーが出てどうやって解決したのかがあやふやになってしまいやすい。あと、何を書いたら良いのかわからず、集中力が低下しやすい。メモを習慣にするための仕組みを作っていきたい。

Dockerを使用して既存のRailsプロジェクト開発環境構築してみた(Rails+Mysql) - Qiita

既存のRailsアプリをDockerコンテナで動かす方法+sequel proによるDBコンテナ可視化 - Qiita

DockerfileにてなぜADDよりCOPYが望ましいのか - Qiita

Gitで.gitignoreを反映させる方法 | Awesome Blog