ritarock’s blog

プログラミングとか映画とか趣味とか

docker-composeでrailsとmysqlを使う

ディレクトリ構成

./
├── Dockerfile
├── docker-compose.yml
├── db_volume/
├── mysql-confd/
│   └── default_authentication.cnf
└── src/
    ├── Gemfile
    └── Gemfile.lock

ファイルの説明

Dockerfile

railsのアプリ用のDockerfileを定義する
mysqlと連携するためにmysql-clientをインストールしている

FROM ruby:latest

RUN apt-get update -qq && \
    apt-get install -y build-essential && \
    apt-get install -y libpq-dev && \
    apt-get install -y mysql-client && \
    apt-get install -y nodejs

RUN mkdir /myapp
ENV APP_ROOT /myapp
WORKDIR $APP_ROOT
ADD ./src/Gemfile $APP_ROOT/Gemfile
ADD ./src/Gemfile.lock $APP_ROOT/Gemfile.lock

RUN bundle install
ADD ./src/ $APP_ROOT

docker-compose

mysqlのバージョンが8以上だと認証でエラーになるので設定ファイルをにマウントする
参考
また
./db_volume:/var/lib/mysqlでDBを永続化している

version: '3'
services:
  db:
    image: mysql:latest
    volumes:
      - ./mysql-confd:/etc/mysql/conf.d
      - ./db_volume:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: root
    ports:
      - "3306:3306"

  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - ./src:/myapp
    ports:
      - "3000:3000"
    links:
      - db

default_authentication.cnf

認証用の設定ファイル

[mysqld]
default_authentication_plugin= mysql_native_password

Gemfile

source 'https://rubygems.org'
gem 'rails', '5.1.6'

Gemfile.lockも作成しておく(中身は空)

$ touch ./src/Gemfile.lock

プロジェクトの構築

$ docker-compose run web rails new . --force --database=mysql --skip-bundle

--skip-bundleでgemのインストールを回避
実行後 ./src 配下に新しいアプリケーションが作成されている

データベースに接続

./src/config/database.ymlを
password部分とhostをdocker-composeで定義した内容に変更

default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: root
  host: db

dockerの起動

ビルド

$ docker-compose build

起動

$ docker-compose up

DBの作成

$ docker-compose run web rails db:create

確認

ブラウザでlocalhost:3000にアクセス

railsのコンテナにアクセスしてDBとの接続確認

$ docker exec -it コンテナID /bin/bash

接続したコンテナからDBに接続

$ rails dbconsole

pythonでlistから辞書を作る、辞書からjsonを作る

まずはlistから辞書を作る

list_col = ['col1', 'col2', 'col3', 'col4', 'col5']
list_data = [1, 2, 3, 4, 5]

dict_data = dict(zip(list_col, list_data))
print(dict_data) # {'col1': 1, 'col2': 2, 'col3': 3, 'col4': 4, 'col5': 5}

次に辞書からjsonを作る

import json

json_data = json.dumps(dict_data)
print(json_data) # {"col1": 1, "col2": 2, "col3": 3, "col4": 4, "col5": 5}

vimをちゃんとやる9

:sort

アルファベット順にソートできる

自動補完呼び出し方法一覧

コマンド 種類
<C-a> 汎用キーワード
<C-x><C-n> 現在バッファのキーワード
<C-x><C-i> インクルードされているファイルのキーワード
<C-x><C-]> tagsファイルのキーワード
<C-x><C-k> 辞書のルックアップ
<C-x><C-l> 行全体の補完
<C-x><C-f> ファイル名を補完
<C-x><C-o> オムニ補完

ポップメニューの操作

キー 操作
<C-n> 次のマッチ
<C-p> 前のマッチ
<C-y> 選択されているマッチを入力
<C-e> テキストに戻る

vimをちゃんとやる8

<C-r><C-w>

検索の自動補完

:%s/{文字}//gn

文字数をカウント

:%s/{対象文字}/{置換後の文字}/g

ファイルの対象文字を置換する
:s/{対象文字}/{置換後の文字} で初めの1文字 :s/{対象文字}/{置換後の文字}/g で行のみ
:%s/{対象文字}/{置換後の文字}/g でファイル全体

:%s/{対象文字}/{置換後の文字}/gc

1文字1文字置換するかどうか確認できる
qで終了
aでカーソル以降全て置換

:%s\=@0/g

レジスタ0の中身を対象に置換する

g&

直前の置換をファイル全体に適用する

gv

直前の選択範囲を再度選択する

csvのフィールドを入れ替える

/\v[^,]*,([^,]),([^,])$
:%s//\3,\2,\1
列選択して、順序入れ替え

2つの単語を入れ替える

/\v(<単語A>|<単語B>)
:%s//\={"単語A":"単語B","単語B":"単語A"}[submatch(1)]/g

vimをちゃんとやる7

\v

/\v で検索することで正規表現エンジンの振る舞いが切り替わる

\x

文字集合 [0-9a-fA-F] を \x で置き換える

\V

nomagic検索に切り替える
この場合、バックスラッシュだけが意味を持つ

/\v<検索したい単語>

単語単位で検索できる

<C-r>レジスタ

レジスタに検索したい文字をヤンクさせてから
/\v<C-r>レジスタ

?

前方一致検索