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