Docker  Rails6  + MySQL mac環境構築メモ

## Docker を使ってのmac上での Rails6 , MySQL 5.7 環境構築メモ
https://www.docker.com/
公式ページからmac用のdockerをインストールしておくこと

[ファイル一式](https://github.com/katafuchix/docker_rails6)

## ファイルの準備
・docker-compose.yml

```docker-compose.yml
version: '3'
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: root
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
    ports:
      - "3306:3306"
    volumes:
      # 初期データを投入するSQLが格納されているdir
      - ./db/mysql_init:/docker-entrypoint-initdb.d
      # 永続化するときにマウントするdir
      - ./db/mysql_data:/var/lib/mysql

  web:
    build: .
    command: rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/app_name
    ports:
      - "3000:3000"
    links:
      - db
```

・Dockerfile

```Dockerfile
FROM ruby:2.7.1

RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
    && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list

# 必要なパッケージのインストール
RUN apt-get update -qq && \
    apt-get install -y build-essential \
                       libpq-dev \
                       nodejs yarn

# 作業ディレクトリの作成、設定
RUN mkdir /app_name
##作業ディレクトリ名をAPP_ROOTに割り当て 以下$APP_ROOTで参照
ENV APP_ROOT /app_name
WORKDIR $APP_ROOT

# ホスト側（ローカル）のGemfileを追加する
ADD ./Gemfile $APP_ROOT/Gemfile
ADD ./Gemfile.lock $APP_ROOT/Gemfile.lock

# Gemfileのbundle install
RUN bundle install
ADD . $APP_ROOT

# おまじない
# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]

```

・Gemfile

```Gemfile
source 'https://rubygems.org'
gem 'rails', '6.0.3'
```

・Gemfile.lock（空のファイル）

・entrypoint.sh

```entrypoint.sh
#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /app_name/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"
```

「app_name」を間違えないように　本当は環境編集から取得するのが良さそう

## mysql, rails のインストール

```
docker-compose run web rails new . --skip-action-mailer --skip-active-storage --skip-action-cable -d mysql
```

## 起動と確認
database.ymlの修正

```database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  host: db  # docker-compose.ymlで定義したMySQLのサービス名
```


DB初期化

```
docker-compose run web rake db:create
```

起動

```
docker-compose up web  
```

エラーが出たので再度コマンド実行

```
docker-compose up web
docker_rails6_db_1 is up-to-date
Creating docker_rails6_web_1 ... done
Attaching to docker_rails6_web_1
web_1  | => Booting Puma
web_1  | => Rails 6.0.3.2 application starting in development 
web_1  | => Run `rails server --help` for more startup options
web_1  | Exiting
web_1  | /usr/local/bundle/gems/webpacker-4.2.2/lib/webpacker/configuration.rb:95:in `rescue in load': Webpacker configuration file not found /app_name/config/webpacker.yml. Please run rails webpacker:install 
 Error: No such file or directory @ rb_sysopen - /app_name/config/webpacker.yml (RuntimeError)
```
メッッセージの通りコマンド実行

```
 docker-compose run web rails webpacker:install
# 略
Webpacker successfully installed 🎉 🍰
```

再度実行

```
docker-compose up web
```

`http://localhost:3000/` でいつもの画面で見れればOK


## rails コマンドの実行

コンソールをもう１つ立ち上げてrailsのコマンドが実行できることを確認しておく

docker-compose run [サービス名] [railsコマンド] の書式で実行

```
docker-compose run web rails g controller home index
```
`http://localhost:3000/home/index` で作成した画面にアクセスできればOK

## docker 停止

```
 docker-compose down   
```

## コンテナの中に入ってコマンドを実行したい場合

`docker container ls ` で実行中のコンテナ名を確認後

```
docker exec -i -t [コンテナ名] bash
```

## 隠しファイルが見れない場合は
`.ruby-version`とか確認で来ていない場合はこのコマンドを実行

```
defaults write com.apple.finder AppleShowAllFiles TRUE
```

Finderを強制再起動