初心者SEのつぶやき

初心者SEのつぶやき

Dev Containersの導入方法

やりたいこと

コンテナコマンド内に入ろうとするたびにコマンド操作が面倒なので、
Dev Containersを導入したい。

導入方法

{
  "name": "好きな名前",
  "dockerComposeFile": "docker-compose.ymlのパス",
  "service": "サービス名(docker-compose.ymlのサービス名に合わせる)",
  "workspaceFolder": "コンテナ内のワークスペースフォルダ設定",
    "customizations": {
        "vscode":{
            "extensions":[拡張機能のIDリスト]
        }
    }
}

vscodeでコンテナに入る方法

  • vscodeの左下の青いボタンをクリック

    実行方法1

  • コンテナーでフォルダを開くをクリック(画像の一番下)

    実行方法2

  • コンテナに入ることができる。

サンプル

docker-composeで作成していたPython環境にDevContainerを導入してみる。

  • docker-compose.yml
version: '3'
services:
    app:
        build: .
        container_name: sns-servey
        volumes:
            - .:/app
        tty: true
  • Dockerfile
FROM python:3.6
RUN pip install --upgrade pip
RUN mkdir /app
WORKDIR /app
COPY . .
RUN pip3 install -r requirements.txt
  • .devcontainer/devcontainer.json
{
  "name": "python-container",
  "dockerComposeFile": "../docker-compose.yml",
  "service": "app",
  "workspaceFolder": "/app",
    "customizations": {
        "vscode":{
            "extensions":[
              "ms-python.python"
            ]
        }
    }
}

実行結果

想定通りに動いていることを確認

実行結果

感想

まだまださわりの部分しか理解できていないので、リファレンスを用いて
どのような活用ができるのか、アップデートしていきたい。

今回の内容が参考になったら幸いです。

Dockerfileの書き方

やりたいこと

Dockerfileの記載方法を整理する。

Dockerfileの書き方

  • FROM
    FROM {イメージ名}:{タグ} でベースとなるイメージを記載する。
    今回はPython3.6を利用している(dockerhub参照)
  • RUN
    RUN {コマンド}で実行したいコマンドを記載
  • COPY
    COPY {コピー元dir} {コピー先dir}でホストマシンからコンテナ内にファイル(ディレクトリ)をコピーする。
    コピー先に存在しないディレクトリの場合、自動作成してくれる。
  • ENV
    ENV {キー}={値}環境変数の指定
  • ARG
    ENV {キー}={デフォルト値(任意)}で変数の指定
  • WORKDIR
    WORKDIR {ディレクトリパス}で作業ディレクトリを変更する。
  • CMD
    CMD["実行ファイル", "パラメータ1", ..."パラメータN"]でコンテナ実行時のデフォルトコマンドを指定する。 複数ある場合は最後のCMDを実行する。
  • マルチステージビルド
    環境毎にイメージを分けたい場合、fromを複数記載ことで実現可能である。
    --target developmentのようにbuild時にオプションで指定することによって指定した環境でビルドできる。
FROM python:3.6 AS base
ENV env=dev
ARG fuga=fuga
RUN pip install --upgrade pip
COPY . /app
CMD["python3", "main.py"]

FROM base AS development
ENV env=dev

FROM base AS production
ENV env=prod

Dockerコマンドまとめ

やりたいこと

よく使うかなって感じのdocker関連のコマンドについて
独断と偏見で整理をしていく。
※勉強しながらなので適宜更新

docker image関係

  • イメージのダウンロード
docker image pull {イメージ名}
  • Dockerfileからイメージを作成
    • -t でイメージ名とタグを指定できる
    • -f でDockerfileを指定できる
    • --build-arg 変数名={値}でargに値を代入できる。
docker image build  -t {好きな名前:好きなタグ名} -f {Dockerfileパス} {ディレクトリパス}
  • イメージ一覧表示
docker image ls
  • イメージ削除
docker image rm {イメージ名}
  • イメージの詳細を表示
docker image inspect {イメージ名}
  • イメージ作成の履歴を表示
docker image history {イメージ名}

docker container関係

  • イメージからコンテナを起動
    • optionについて
      • -iは標準入力をopen
      • -tは出力結果の成形
      • -dでバックグラウンドで起動(デタッチドモード)
      • --nameでコンテナに名前を付ける
      • --rmで実行後自動削除
      • -p{ホスト側のポート}:{コンテナ側のポート}でコンテナとホストマシンのポートを紐づける。
      • --network{ネットワーク名}でDockerネットワークに紐づける。
    • コマンド未指定の場合はdefaultコマンド実行
    • 下記オプションの追加でボリュームに接続しながらコンテナ起動が可能(どちらも同じ意味)
      • -v {ボリューム名}:{コンテナ内絶対パス}
      • --mount type=volume src={ボリューム名} dst={コンテナ内絶対パス}
    • 下記オプションの追加でボリュームにバインドマウントしながらコンテナ起動が可能(どちらも同じ意味)
      • -v {ホスト絶対パス}:{コンテナ内絶対パス}
      • --mount type=volume src={ホスト絶対パス} dst={コンテナ内絶対パス}
// option何もなし
docker container run  {イメージ名} 
// optionあり
docker container run -itd --name {好きな名前}  {イメージ名} {実行したいコマンド}
  • 起動しているコンテナに対して任意のコマンドを実行させる
docker container exec {オプション(itdなど)} {コンテナ名} {実行したいコマンド}
  • バックグラウンド(デタッチドモード)で起動しているコンテナをフォアグラウンドモードにする。
docker container attach {コンテナ名}
  • 起動しているコンテナ一覧
docker container ls
  • コンテナ一覧(起動していないものも含む)
docker container ls -a
  • コンテナを停止
docker container stop {コンテナ名}
  • コンテナを再起動
docker container restart {コンテナ名}
  • コンテナを削除
    • -fオプションで強制削除
docker container rm {コンテナ名}
  • 停止済みコンテナを一括削除
docker container prune

docker volume関係(コンテナとは分離して管理しているボリューム領域関係)

  • 新しいボリューム領域を作成する。
docker volume create {ボリューム名}
  • ボリューム領域の一覧を表示する。
docker volume ls
  • ボリューム領域の詳細情報を表示する。
docker volume inspect {ボリューム名}
  • ボリューム領域を削除する。
docker volume rm {ボリューム名}

docker network関係

  • 新しいDockerネットワークを作成する。
docker volume create {ネットワーク名}
  • Dockerネットワークの一覧を表示する。
docker network ls
  • Dockerネットワークの詳細を表示する。
docker network inspect {ネットワーク名}
  • Dockerネットワークを削除する。
docker network rm {ネットワーク名}

docker compose 関係

  • 起動コマンド
    • -dでデタッチドモード
    • --buildで再ビルド
docker compose up
  • 停止コマンド
docker compose stop
  • 削除コマンド
docker compose down

【Ruby on Rails】アプリを公開する方法 Render + Neon

これは2024/04/02時点の情報です。

やりたいこと

作成したRailsアプリを無料でデプロイしたい。

利用するサービス

Render.com

webアプリ公開することができるPaas

render.com

Neon

PostgreSQLのデプロイサービス

neon.tech

デプロイ手順

Neonデプロイ

はじめにNeonの方からセットアップする。

  • 公式サイトにアクセスしてFree Tierでアカウント登録を行う。

  • 画面の指示に従ってdatabaseを作成する。

  • DashbordからConnection Detailsを開く。

  • Connection Details内のconnection stringをNode.jsに切り替える。
    その下に出てきた.envタブを選択する。

    Neonの設定画面

  • タブ内にあるPGHOST,PGDATABASE,PGUSER,PGPASSWORDP,ENDPOINT_IDをメモする。
    もしPGPASSWORDが不明の場合、サイドバーのbranchsのRolesから
    リセットパスワードを実行し、再度passwordを発行する。
    ※この内容は秘匿情報なので絶対に他人に公開しないでください

  • メモした内容を元にEDITOR="vi" rails credentials:editコマンドでrails内のconfig/credentials.yml.encに下記内容を追加する。

  neon:
    username: PGUSERの内容
    host: PGHOSTの内容
    database: PGDATABASEの内容
    password: PGPASSWORDの内容
  • config/database.ymlに下記内容を追加する。
  production:
    <<: *default
    host: <%= Rails.application.credentials.neon&.fetch(:host) %>
    database: <%= Rails.application.credentials.neon&.fetch(:database) %>
    username: <%= Rails.application.credentials.neon&.fetch(:username) %>
    password: <%= Rails.application.credentials.neon&.fetch(:password) %>
    ssl_mode: verify_identity
    sslca: "/etc/ssl/certs/ca-certificates.crt"

Renderデプロイ

  • config/puma.rbに下記内容を追加する。
workers ENV.fetch("WEB_CONCURRENCY") { 2 }
preload_app!
  • config/environments/production.rbに下記を記載する。
config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? || ENV['RENDER'].present?
  • bin/render-build.shを作成し、下記コマンドを記載する。
#!/usr/bin/env bash
# exit on error
set -o errexit

bundle install
bundle exec rake assets:precompile
bundle exec rake assets:clean
bundle exec rake db:migrate
  • 公式サイトでRenderの登録を行う。
  • 登録できたらダッシュボードのヘッダーのnewからWeb Serviceをクリックする。(対象GitHubリポジトリと連携する。)

    renderヘッダー

  • 登録時の内容は下記となる。

項目 入力内容
Branch デプロイしたいブランチ名
Runtime Ruby
Build Command ./bin/render-build.sh
Start Command bundle exec puma -C config/puma.rb
Instance Type Free
  • 画面下部のAdvanced内のAdd Environment Variableconfig/master.keyに記載の文字列をRAILS_MASTER_KEYとして登録する。

  • Create Web Serviceをクリックするとデプロイ開始

  • デプロイ完了し下記画面のURLをクリックするとデプロイしたアプリにアクセスできる。

    render dashbord

    感想

    Renderの記事は多かったが、DBサービスに関してはあまり情報がなく
    苦戦した。
    スタートアップアプリや個人開発だとあまりコストかけたくないかなと思うので、今回の記事が参考になったら幸いです。

【Ruby on Rails】RSpecの導入方法

やりたいこと

railsアプリケーションにRSpecを導入したい。

導入方法

RSpecのインストール

gemファイルにrspec-railsfactory_bot_railsを記載する。
FactoryBotはテストデータ生成をしてくれる便利ライブラリのため、
ついでにインストールする。

group :development, :test do
  gem "rspec-rails"
  gem "factory_bot_rails"
end

Gemfile更新後、bundle installを行う。

その後、下記コマンドを叩き、動かすために必要なファイルを生成する。

rails g rspec:install

rspecを叩き、レスポンスが返ってきたら、インストール成功となる。

初期設定

testディレクトリの削除

テストコードは、specフォルダ以下に作成するため、
既存のtestディレクトリは削除する。

rm -r test/

FactoryBotの設定

テストでFactoryBotを利用する時、モジュール名を省略できるようにする。
spec/rails_helper.rbファイルに下記内容を追記する。

  config.include FactoryBot::Syntax::Methods

generate時の自動ファイル生成の設定

rails generaterコマンドでRSpec関係のファイルを自動生成されるための設定

config/application.rbに下記内容を追記する。

    config.generators do |g|
      g.test_framework :rspec
    end

テスト結果の出力設定

.rspecファイルに下記のように出力結果の設定ができる。

--require spec_helper
--color
--format d

感想

調べたら色々カスタマイズできそうだったので今後まとめたい。

今回の内容が参考になったら幸いです。

【Ruby on Rails】deviseを用いた認証機能を制限したい

やりたいこと

railsアプリケーションにて、deviseを用いた認証機能を制限したい。
例) サインアップ機能の廃止など...
導入方法は下記記事を参照 locomocosan.hatenablog.com

機能を制限する方法

deviseの標準機能を制限するには、app/models/user.rbのファイルを変更必要がある。

class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
              :recoverable, :rememberable, :validatable
end

デフォルトで有効になっている機能とモジュールは下記となる。

モジュール 機能
database_authenticatable パスワードの暗号化
registerable サインアップ
recoverable パスワードリセット
rememberable クッキーにログイン情報を保持
validatable バリデーション

追加で使えるモジュールと機能については下記となる。

モジュール 機能
confirmable メール認証
lockable ロックアウト
timeoutable ユーザーセッションのタイムアウト
trackable ユーザーアクティビティをトラッキング
omniauthable 外部プロバイダーを利用した認証

もしサインアップ機能を廃止したい場合は、registerableを削除することで
実装できる。
また、googleアカウントなどの外部のプロバイダーを利用した認証を行いたい
場合、omniauthableを有効にすることで実装が可能になる。(別途設定など必要)

感想

viewやコントローラーの編集、認証機能のカスタマイズなど
まだまだ奥が深そうなので、別の機会にまとめたい。

今回の内容が参考になったら幸いです。

Gitコマンドメモ

やりたいこと

よく使うGitコマンドをまとめたい。

よく使うGitコマンド(適宜更新)

  • ステージエリアにファイル追加
git add ファルパス
  • コミットコマンド
git commit -m "コミットコメント"
  • リモートブランチに反映(プッシュコマンド)
git push
  • リモートブランチの内容を反映(プルコマンド)
git pull
git fetch
  • ブランチのマージ
git merge ブランチ名
  • マージの取り消し
git merge --abort
  • コミット履歴の閲覧
git log
  • コミットの取り消し(コミットのログごと消す)
git reset --hard コミットのハッシュ値
  • コミットのうち消し(コミットのログは残す)
git revert コミットのハッシュ値
  • 現在のブランチを確認
git branch
  • ブランチの移動
git switch ブランチ名
git checkout ブランチ名

用途別コマンドの使い方

開発用ブランチにMasterブランチの最新を取り込む

  • masterにチェックアウト
git checkout master
  • git pullでローカルのmasterを最新にする
git pull origin master
  • 開発ブランチに移動
git checkout develop
  • masterの内容をマージ
git merge origin master -m "コミットコメント"

あとがき

適宜一覧は更新していきます。

今回の内容が参考になったら幸いです。