0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Rails&Docker&MySQLの環境構築] コンテナ起動したが、MySQLが見つからない...?

Last updated at Posted at 2020-11-01

概要

ポートフォリオ制作真っ最中です。
最初の環境構築で早速躓いてしまったので、備忘録の意味も含めて書きます。
初心者で同じところで躓いてしまった方に届けば嬉しいです。
※誤りなどあれば、コメントくださると嬉しいです。

今までのフロー

  • 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はこんな感じです。

Dockerfile
# 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

(コメントだらけで逆に見づらいという。。。)

docker-compose.yml
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:
Gemfile
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したが、
だめでした。。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?