- 投稿日:2020-12-08T23:04:28+09:00
MyBatis内のSQL <![CDATA[ 比較演算子 ]]>
Mapper.xmlファイル内のSQLで引っかかったので個人的メモ。
Mapper.xml'select A.cutromer_id ,A.number ,case when B.customer is not null and B.customer <![CDATA[<>]]> '' else '' end AS C from A left join B on A.cutromer_id = B.cutromer_id'MySQLに読み替える際、<![CDATA[ ]]>を除いて書き換える必要がありました。
*比較演算子はちゃんと書く。MySQL.'select A.cutromer_id ,A.number ,case when B.customer is not null and B.customer <> '' else '' end AS C from A left join B on A.cutromer_id = B.cutromer_id'MyBatisはXMLファイルにSQL文を定義して使用する。
XMLなので比較演算子が直接、使えないのがわかっていたつもりでした?
- 投稿日:2020-12-08T21:00:54+09:00
【Rails】既存のRails6プロジェクトにDockerを導入してみる
はじめに
既存のRailsプロジェクトをDockerに乗せていきます。
初学者による記事なので間違い等ございましたらご指摘いただけると幸いです。
※本記事は開発環境のみの導入を対象としています。参考
Dockerが何なのか全く分からない!という方はまずは下記の記事を参考にDockerを触ってみてください。
DockerをMacにインストールする
こちらの記事も手っ取り早くDockerをふんわり理解するのにオススメです。
Dockerについてなるべくわかりやすく説明する環境
- macOS Catalina 10.15.7
- Ruby 2.6.5
- Rails 6.0.3.3
- Docker 19.03.13
- docker-compose 1.27.4
- MySQL 5.6.47
目次
- 必要ファイルの作成
- ファイル構成
- 作成したファイルの編集
- コンテナの起動
必要ファイルの作成
必要ファイルは以下の5つです。rails newをした際に自動生成されるファイルもあるので必要なもののみ作成していきましょう。
- Dockerfile
- docker-compose.yml
- Gemfile
- Gemfile.lock
- database.yml
ファイル構成
既存のアプリケーション名 └── app ├── Dockerfile # 作成 ├── docker-compose.yml # 作成 ├── Gemfile ├── Gemfile.lock ├── config └──database.yml作成したファイルの編集
Dockerfile
DockerfileFROM ruby:2.6.5 #自身のrubyバージョンを指定 (ruby -v) RUN apt-get update && apt-get install -y curl apt-transport-https wget && \ 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 && apt-get install -y --no-install-recommends\ nodejs \ yarn \ mariadb-client \ build-essential \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* WORKDIR /myproject COPY Gemfile /myproject/Gemfile COPY Gemfile.lock /myproject/Gemfile.lock RUN gem install bundler RUN bundle install RUN yarn install --check-files COPY . /myprojectRails6でwebpackerが標準になったことでyarnのインストールが必要になってきます。
Docker Hubで確認するとrubyのイメージはDebian系となっているので、yarnの公式ドキュメントに記載されているOS毎のインストール方法を参考に記述していきます。
ちなみに、yarnの公式ドキュメントは日本語表示のままだとなぜかOSの選択肢の中にMacとWindowsしか表示してくれないので英語表示に切り替えて確認しましょう。docker-compose.yml
docker-compose.ymlversion: '3' services: db: #データベースのコンテナ作成 image: mysql:5.7 #自身のmysqlバージョンを指定 (mysql --version) command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci ports: - '3306:3306' volumes: - mysql-data:/var/lib/mysql environment: MYSQL_DATABASE: myapp_development #プロジェクト名_development MYSQL_ROOT_PASSWORD: password MYSQL_USER: root MYSQL_PASSWORD: password web: #アプリケーションのコンテナ作成 build: context: . dockerfile: Dockerfile command: bundle exec rails s -p 3000 -b '0.0.0.0' tty: true stdin_open: true depends_on: - db ports: - "3000:3000" volumes: - .:/myproject volumes: #dbを永続化するための記述 mysql-data:Gemfile
Gemfilesource 'https://rubygems.org' gem 'rails', '~>6.0.0'既存アプリケーションの場合この記述はすでにあるはずですが念のため確認しておきましょう。
database.yml
database.ymldefault: &default adapter: mysql2 encoding: utf8 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root #docker-compose.ymlで指定したユーザー名 password: password #docker-compose.ymlで指定したパスワード development: <<: *default database: myapp_development #プロジェクト名_development host: db #docker-compose.ymlでデータベースのコンテナ作成部分で指定したservice名 test: <<: *default database: myapp_test #プロジェクト名_test host: db #docker-compose.ymlでデータベースのコンテナ作成部分で指定したservice名アプリケーションのコンテナからデータベースのコンテナに接続するための設定を記述していきます。
セキュリティ面を気にする場合はusernameとpasswordに環境変数を設定しましょう。今回は開発環境のみということもあり設定していません。コンテナの起動
ターミナルcd myapp docker-compose build #コンテナを建てる docker-compose up -d #コンテナ起動(-dオプションをつけることでバックグラウンドで実行)これで localhost:3000 にアクセスするとページが表示されます◎
- エラーが発生した場合は
ターミナルdocker-compose logs -f
でリアルタイムでログの確認ができるのでエラー原因を探して解決しましょう。
- サーバーを停止させたいときは以下のコマンドを実行してください。
ターミナルdocker-compose down
最後に
実装に思いの外手間取ったので備忘録的に記事にしてみました。
どなたかの参考になれば幸いです。
- 投稿日:2020-12-08T19:02:59+09:00
Mysql入門【授業編】
XAMPPからmysqlにつないで、DB作成、テーブル作成の流れをやる
①XAMPP起動
startボタンを押す
②ターミナルに繋いで、mysql起動
open terminalをクリック。
その後、ターミナルが開いたら
mysql
そして、
MariaDB [(none)]>
が表示されたら、オッケー。
③データベースに繋ぐ
既存のDBに繋ぐ。
use データベース名
④確認系のコマンド
今あるテーブルの一覧を表示
show tables;
+---------------+
| Tables_in_saku |
+---------------+
| country |
| mhold |
| mount |
| rhold |
| river |
+---------------+こんな感じで出てくる
⑤テーブル作る
create table sns ( id serial primary key, name text, title text, message text not null, date date not null, password text );それからshow tables;で確認するとsnsが追加されているはず!
⑤テーブルの確認(詳細)
テーブルの詳細確認は、
describe テーブル名;
desc テーブル名;
でも可能+----------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------------+------+-----+---------+----------------+
| id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| name | text | YES | | NULL | |
| title | text | YES | | NULL | |
| message | text | NO | | NULL | |
| date | date | NO | | NULL | |
| password | text | YES | | NULL | |
+----------+---------------------+------+-----+---------+----------------+
こんな感じ
- 投稿日:2020-12-08T16:34:46+09:00
docker ruby(2.6.5)・mysql(5.6.47)・rails(6.0.0)の開発環境構築
概要
dockerを開発環境に使ってアプリを作成しました。初めてdockerを使ってなかなかうまく動かなかったので動いたものをアウトプットを含めて共有します。また、deviseの導入も行って開発も少々行っていきたいと思います。
dockerの導入
ベースはdockerの公式サイトにRailsとPostgresSQLのdocker-composeの使い方が乗っていたのでそちらを参考にします。
dockerの公式サイト
https://docs.docker.com/compose/rails/ただ、rails6.0.0からはwebpackerが標準になったことにより6.0.0を使う際には修正が必要です。また、今回はmysqlを使うのでそちらも変更していきます。
アプリのディレクトリ作成
ターミナル.mkdir sampleappアプリのディレクトリに移動
ターミナル.cd sampleappdockerfileの生成
ターミナル.touch dockerfiledockerfileの編集
作成したdockerfileを以下のように編集します。
dockerfile.FROM ruby:2.6.5 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 /myapp WORKDIR /myapp COPY Gemfile /myapp/Gemfile COPY Gemfile.lock /myapp/Gemfile.lock RUN bundle install COPY . /myapp COPY entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] EXPOSE 3000 CMD ["rails", "server", "-b", "0.0.0.0"]公式の以下の点を修正しました。
1.rubyのバージョンを変更。
2.webpackerが標準になったことにより、必要になったyarnのインストールを行う。FROM ruby:2.6.5
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.listRUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs yarn
entrypoint.shの生成
touch entrypoint.shentrypoint.shの編集
作成したentrypoint.shを編集します。こちらはdockerの公式サイトの通りになります。
entrypoint.sh#!/bin/bash set -e # Remove a potentially pre-existing server.pid for Rails. rm -f /myapp/tmp/pids/server.pid # Then exec the container's main process (what's set as CMD in the Dockerfile). exec "$@"docker-compose.ymlの生成
touch docker-compose.ymldocker-compose.ymlの編集
生成したファイルを以下のように編集します。
docker-compose.ymlversion: "3" services: db: image: mysql:5.6.47 environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: root ports: - "3306:3306" volumes: - ./db/mysql/volumes:/var/lib/mysql web: build: . command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" stdin_open: true tty: true volumes: - .:/myapp - gem_data:/usr/local/bundle ports: - "3000:3000" depends_on: - db volumes: mysql_data: gem_data:公式のリファレンスではpostgresqlを使っているためmysqlにしています。
services:
db:
image: mysql:5.6.47
environment:
MYSQL_USER: root
MYSQL_ROOT_PASSWORD: password
ports:
- "3306:3306"
volumes:
- ./db/mysql/volumes:/var/lib/mysqlアプリ製作中にbinding.pryを使えるように以下を追加しています。
stdin_open: true
tty: trueデータとgemを永続化するために以下の記述を追加しています。
volumes:
mysql_data:
gem_data:Gemfileの生成
ターミナル.touch Gemfile生成したファイルを以下のように編集します。
Gemfile.source 'https://rubygems.org' gem 'rails', '~>6'空のGemfile.lockを生成
ターミナル.touch Gemfile.lockrailsのプロジェクトを作成
ターミナル.docker-compose run web rails new . --force -d mysqldocker-composeをbuildする
ターミナル.docker-compose builddatabase.ymlの修正
config/database.ymldefault: &default adapter: mysql2 encoding: utf8 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: password host: dbdocker-composeの再起動
docker-composeを一旦downさせてバックグラウンドで起動するようにコマンドを入力
ターミナル.docker-compose down docker-compose up -dデータベースの作成
ターミナル.docker-compose run web bundle exec rails db:createここまできたらlocalhost:3000/にアクセスしてみましょう。以下の画面が表示されるはずです。
deviseを用いた簡単なアプリの開発
ここからはアプリ開発の入り口をやっていきます。
コントローラーとビューを生成
トップページを表示するためにposts(投稿)コントローラーとindexのビューを生成します
ターミナル.docker-compose run web rails g controller posts index生成したらルーティングを設定します。routes.rbを以下のように編集しましょう。
config/routes.rbRails.application.routes.draw do root 'posts#index' get 'posts/index' endこの時点でlocalhost:3000/にアクセスすると以下のような画面になっています。
先ほど作成したpostsのindex(view)が表示されていることがわかります。deviseの導入
gemファイルの一番したにdeviseを記述します。
Gemfile.gem 'devise'bundle installを行う
dockerを利用している場合には通常行っているコマンドに "docker-compose run web"をつける必要があります。
ターミナル.docker-compose run web bundle installdockerの再起動
gemを新たに追加したためdocker-composeの再起動を行います。
ターミナル.docker-compose down docker-compose up -dあとは通常のdeviseと同じ作業を行っていきます。
それぞれのコマンドを入力していきます。ターミナル.docker-compose run web rails g devise:install docker-compose run web rails g devise user docker-compose run web rails db:migrate docker-compose run web rails g devise:viewsここまできたら再度dockerを再起動させます
ターミナル.docker-compose down docker-compose up -dここまででdeviseの導入全てが終わったためあとはposts/index.html.erbに以下を記述してみましょう。
posts/index.html.erb<%=link_to "ログイン", new_user_session_path %>ここまででlocalhost:3000/にアクセスするとログインボタンが表示され、押すとログイン画面に遷移します。
これでdockerを使ってdeviseを動かすところまで行えました。
ここからはそれぞれのオリジナルアプリの仕様に従って開発ができると思います。
トップページ
- 投稿日:2020-12-08T09:32:21+09:00
AWS EC2上にDockerコンテナ(Laravel, MySQL, nginx)を起動しアクセスする
環境
- Mac
- Docker
- EC2 (Amazon Linux2, t2.micro)
- nginx
- Laravel
- MySQL
- Github
ゴール
前提
- 今回はお試しなのでEC2は無料利用枠を使えるAmazon Linux2, t2.micro選定
- EC2のインスタンスならびにSSHの接続で使用するキーペアは作成済みとする。
EC2にログインする
xxx.pemにEC2を作成する際に作成したキーペアのファイルパス、(接続先にユーザー名)@(EC2のパブリックDNS)を指定する。
ユーザー名はデフォルトで「ec2user」、EC2のパブリックDNSはEC2の詳細画面で確認する。mac$ sudo ssh -i xxx.pem ec2user@ec2-xx-xx-xx-xx.ap-northeast-1.compute.amazonaws.com __| __|_ ) _| ( / Amazon Linux 2 AMI ___|\___|___| https://aws.amazon.com/amazon-linux-2/dockerをインストールする
ec2$ sudo yum install docker 読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd 依存性の解決をしています --> トランザクションの確認を実行しています。 ---> パッケージ docker.x86_64 0:19.03.6ce-4.amzn2 を インストール --> 依存性の処理をしています: runc >= 1.0.0 のパッケージ: docker-19.03.6ce-4.amzn2.x86_64 --> 依存性の処理をしています: containerd >= 1.3.2 のパッケージ: docker-19.03.6ce-4.amzn2.x86_64 --> 依存性の処理をしています: pigz のパッケージ: docker-19.03.6ce-4.amzn2.x86_64 --> 依存性の処理をしています: libcgroup のパッケージ: docker-19.03.6ce-4.amzn2.x86_64 --> トランザクションの確認を実行しています。 ---> パッケージ containerd.x86_64 0:1.3.2-1.amzn2 を インストール : $ docker --version Docker version 19.03.12, build 48a66213fe <- インストールされたことを確認docker-composeをインストールする
最新バージョンを公式サイトで確認しインストールする
ec2$ sudo curl -L https://github.com/docker/compose/releases/download/1.27.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 651 100 651 0 0 2141 0 --:--:-- --:--:-- --:--:-- 2134 100 11.6M 100 11.6M 0 0 3734k 0 0:00:03 0:00:03 --:--:-- 5900k $ sudo chmod +x /usr/local/bin/docker-compose <- 実行権限を与える $ docker-compose --version docker-compose version 1.27.0, build 980ec85b <- インストールされたことを確認gitインストール
ec2$ sudo yum install git-all 読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd amzn2-core | 3.7 kB 00:00:00 依存性の解決をしています --> トランザクションの確認を実行していますローカル(Mac)で作成した環境を取り込む
今回はgithub上にあるリポジトリからクローンする
ec2$ git clone https://github.com/xxx.git Cloning into 'typing-app'... Username for 'https://github.com': xxx <- githubのユーザー名を入力 Password for 'https://narita-akk@github.com': <- githubのパスワードを入力 remote: Enumerating objects: 133, done. remote: Counting objects: 100% (133/133), done. [ec2-user@ip-172-31-47-56 ~]$ ls <- クローンされたことを確認 test-projectDockerのデーモンを起動する
ec2$ systemctl status docker.service <- デーモンの状態を確認 ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled) Active: inactive (dead) Docs: https://docs.docker.com $ sudo systemctl enable docker.service <- デーモンを有効化する Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service. $ systemctl status docker.service <- デーモンが有効化されたことを確認 ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled) Active: inactive (dead) Docs: https://docs.docker.com $ sudo systemctl start docker <- デーモンを起動する $ systemctl status docker <- デーモンが起動されたことを確認 ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled) Active: active (running) since 金 2020-09-11 23:03:25 UTC; 5s ago Docs: https://docs.docker.com Process: 3651 ExecStartPre=/usr/libexec/docker/docker-setup-runtimes.sh (code=exited, status=0/SUCCESS) Process: 3638 ExecStartPre=/bin/mkdir -p /run/docker (code=exited, status=0/SUCCESS) Main PID: 3659 (dockerd) Tasks: 8 Memory: 118.4M CGroup: /system.slice/docker.service └─3659 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --default-ulimit nofile=1024:4096 :Dockerコンテナを構築し起動する
ec2$ docker-compose up -d --build Creating network "typing-app_default" with the default driver Creating volume "typing-app_db-store" with default driver Building app Step 1/7 : FROM php:7.4-fpm-buster 7.4-fpm-buster: Pulling from library/php d121f8d1c412: Pull complete : $ docker ps <- 起動されているコンテナを確認 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 734c90dda24a nginx:1.19.2-alpine "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 0.0.0.0:10080->80/tcp typing-app_web_1 0e545f085ec4 typing-app_app "docker-php-entrypoi…" 2 minutes ago Up 2 minutes 9000/tcp typing-app_app_1 f860eb86350e mysql:8.0 "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 3306/tcp, 33060/tcp typing-app_db_1Laravelの初期設定をする
ec2$ docker-compose exec app bash <- Laravelがインストールされているコンテナに入るec2(app)$ composer install <- 必要なパッケージをインストール Loading composer repositories with package information Installing dependencies (including require-dev) from lock file Package operations: 106 installs, 0 updates, 0 removals - Installing doctrine/inflector (2.0.3): Downloading (100%) - Installing doctrine/lexer (1.2.1): Downloading (100%) - Installing dragonmantank/cron-expression (3.0.1): Downloading (100%) - Installing voku/portable-ascii (1.5.3): Downloading (100%) : $ ls -al <- .env.exampleがあることを確認 total 304 drwxrwxr-x 12 1000 1000 4096 Sep 12 05:33 . drwxr-xr-x 1 root root 33 Sep 12 05:33 .. -rw-rw-r-- 1 1000 1000 220 Sep 12 05:26 .editorconfig -rw-rw-r-- 1 1000 1000 784 Sep 12 05:26 .env.example -rw-rw-r-- 1 1000 1000 111 Sep 12 05:26 .gitattributes : $ cp .env.example .env <- .env.exampleを.envにコピー $ php artisan key:generate <- アプリケーションキーを作成 Application key set successfully. root@3e98c590943b:/work# ls -al <- storageの権限を確認 : total 304 drwxrwxr-x 5 1000 1000 46 Sep 12 05:26 storage : $ cd bootstrap/ $ ls app.php cache $ ls -al <- bootstrap/cacheの権限を確認 total 8 drwxrwxr-x 2 1000 1000 64 Sep 12 05:34 cache : $ cd .. $ chmod -R 777 storage <- storageフォルダに書き込み権限を付与 $ chmod -R 777 bootstrap/cache/ <-bootstrap/cache/フォルダに書き込み権限を付与 :ec2の80番ポートを開けてhttpアクセスを許可する
ec2のセキュリティグループを編集する
ec2にブラウザからアクセス
Laravelが表示できた!
参考サイト