概要
ポートフォリオ制作真っ最中です。
最初の環境構築で早速躓いてしまったので、備忘録の意味も含めて書きます。
初心者で同じところで躓いてしまった方に届けば嬉しいです。
※誤りなどあれば、コメントくださると嬉しいです。
今までのフロー
- Dockerfileを作成
- docker-compose.ymlを作成
- config/database.ymlの環境変数を修正
-
$docker-compose up
で、こちらのエラー...
Could not find gem 'mysql2 (>= 0.4.4)' in any of the gem sources listed in your Gemfile.
解決法
①MySQLをローカルにインストール
②bundle install
③Gemfile.lockができたこと確認
原因
根本原因は、以前MySQLをローカルにインストールしたときに環境を汚していたことでした。
ソケットや権限に問題あり、bundle install
でうまくMySQLを引っ張ってこれなかったぽいです。
そのため、一旦MySQLのディレクトリを全て削除して再度ローカルにMySQLをインストール。
その後bundle install
した形です。
Gemfile.lockがうまく機能していなかったので、docker-compose up
してもmysql引っ張ってこれませんでした。
そういえば、bundle install
してもgemfile.lockは作成されてませんでした。(泣)
rails×dockerはそういったローカルの状態が影響を与えうるとのことです。
勉強になりました。
以下、環境/経緯などです。
作成ファイル
Dockerfileとdocker-compose.ymlはこんな感じです。
# Rubyを使用
FROM ruby:2.6.6
# 文字コードをUTF-8に設定
ENV LANG C.UTF-8
# TimeZoneを日本に設定
ENV TZ Asia/Tokyo
# ルート直下にappディレクトリを作成
RUN mkdir /app
# 作業ディレクトリに/appを指定して移動
WORKDIR /app
# HostのGemfileを共有
COPY Gemfile /app/Gemfile
# 各種パッケージをインストール
# libpq: GemにてMySQLを導入するために必要
# sudo: 権限変更管理
# bundler(Gemfileに記載されたパッケージをインストールする仕組み)をインストール
RUN apt-get update -qq && apt-get install -y build-essential \
libpq-dev \
sudo \
&& gem install bundler:2.0.1
# Gemfileに記載されたパッケージをインストール
# Gemfileにはrails 6.0.3'が記載されている
RUN bundle install
# /appとカレントディレクトリを共有
COPY . /app
(コメントだらけで逆に見づらいという。。。)
version: "3"
# dbとbackendのコンテナを作成
services:
db:
container_name: db
#DockerHubにアップされているイメージをプル
image: mysql:latest
#環境変数設定
environment:
TZ: Asia/Tokyo #Dockerfileと同様にTimeZoneを設定
MYSQL_DATABASE: linpy_database #データベース名を設定
MYSQL_ROOT_PASSWORD: ***** #ルートユーザーのパスワードを設定
MYSQL_USER: ***** #使用ユーザーを定義
MYSQL_PASSWORD: ***** #上記ユーザーのパスワードを設定
#マウントする設定ファイルのパスを指定
volumes:
- mysql_data:/var/lib/mysql
#ポートを設定
ports:
- 3307:3306
#IPアドレスを設定
networks:
app_net: #後述のapp_netネットワーク空間の以下のIPを使用するよう設定
ipv4_address: '172.20.0.2'
backend:
container_name: backend
#ComposeFileを実行し、ビルドされるときのpathを指定
build: ./backend/
image: backend
#gemを動かしてサーバー立ち上げし、0.0.0.0にバインドしてフルアクセスできるようにする
command: bundle exec rails server -b 0.0.0.0
#コンテナの常時起動
tty: true
#入力のインターフェースを起動 docker run -itのitと同義
stdin_open: true
#バックエンドはcashe, temp, log, gitにもマウント
volumes:
- ./backend:/app:cached
- bundle_data:/usr/local/bundle:cached
- /app/vendor
- /app/tmp
- /app/log
- /app/.git
environment:
TZ: Asia/Tokyo
#起動順を制御, dbの後
depends_on:
- db
ports:
- 5000:3000 # ポートフォワード
networks:
app_net:
ipv4_address: '172.20.0.3'
# 独自のネットワークを設定
networks:
#app_netというネットワーク空間を定義
app_net:
driver: bridge #bridgeネットワークへ接続
ipam: #IP設定
driver: default
config:
- subnet: 172.20.0.0/24 #Subnetを定義
# 2つのvolumeを定義
volumes:
mysql_data:
bundle_data:
source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
ruby '2.6.6'
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 6.0.3'
# Use mysql as the database for Active Record
gem 'mysql2', '>= 0.4.4'
# Use Puma as the app server
gem 'puma', '~> 4.1'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
# gem 'jbuilder', '~> 2.7'
# Use Redis adapter to run Action Cable in production
# gem 'redis', '~> 4.0'
# Use Active Model has_secure_password
# gem 'bcrypt', '~> 3.1.7'
# Use Active Storage variant
# gem 'image_processing', '~> 1.2'
# Reduces boot times through caching; required in config/boot.rb
gem 'bootsnap', '>= 1.4.2', require: false
# Use Rack CORS for handling Cross-Origin Resource Sharing (CORS), making cross-origin AJAX possible
# gem 'rack-cors'
group :development, :test do
# Call 'byebug' anywhere in the code to stop execution and get a debugger console
gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
end
group :development do
gem 'listen', '~> 3.2'
# Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
gem 'spring'
gem 'spring-watcher-listen', '~> 2.0.0'
end
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
てなわけなんですが、足りないgemがある...?
bundle install
しているのに...
docker-compose build
した際は、これが出てました。
Fetching mysql2 0.5.3
Installing mysql2 0.5.3 with native extensions
解決できなかった方法
NG1: 魔法の言葉とやらを追記してみる
DockerfileのRUN bundle install
の前に以下を追記してみる。
魔法の言葉:bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib" \
だめでした。。。
NG2: キャッシュクリアしてみる
docker-compose build --no-cache
でビルドした後、docker-compose up
したが、
だめでした。。