Rails6アプリ on Docker
自分のPCについて
- MacBook Air
- Apple M1
- macOS Ventura 13.2.1
昔から使い続けてて、いらんもんがいろいろ気づかずに残ってそうなシロモノ。
DockerもIntel Macのときに入れてました。
Dockerをインストール
brewでやろうとしたがやめた
最初brewでインストールしました。
コンソールを眺めていたら、amd64のパッケージだったので :thinking: となりながら。
本家Dockerにはarm64のバイナリがありましたし。
まぁ、いっか…と思って起動してみたら、CPUアーキテクチャが違うぞとエラーが出ました。
OKしたら起動しようと努力していたようでしたが…メニューバーでクジラがずっとコンテナの積み下ろしを続けてました。
通常の手順で停止しようとしてもダメで、アクティビティモニタからDockerを強制終了しました。
本家Dockerからarm64版をインストール
そんな感じだったので、本家からarm64版をダウンロードしてインストールしました。
インストールは無事に済んだのですが…起動ができず…。
あちこち見てたら、factory resetができるダイアログが出ているのに気づき、ポチりました。
もう一度起動を試みると、ちゃんと起動しました。
チュートリアル
Dockerを起動すると、チュートリアルを進めてきました。
インストールでトラブっていたので、ちゃんと動くことを確認したく、やりました。
ごく普通に終わりました。
…ただ、チュートリアル中にDockerHubにイメージをpushしようとしたときに気づいたのですが、ずっと前に設定したアカウント情報がそのままになっており…factory resetとは?となりました。
それ以外は問題なく起動したので、よかったです。
サンプル用Railsアプリ
説明を書くとデカくなりすぎるので、仕様だけ。
-
Ruby3.0
-
Rails6.0
-
mysql5.7
-
webpacker
-
rspec
-
rubocop
-
rails g scaffold article title:string body:text
-
rails g controller top index
この状態。
雑な第1稿。
Mysql2::Error::ConnectionError
が出た><
FROM ruby:3.0.5
# RUN apt-get update -qq && apt-get install -y nodejs mysql-client
RUN apt-get update -qq && apt-get install -y nodejs
WORKDIR /app
COPY Gemfile Gemfile.lock /app/
RUN bundle install
COPY . /app
version: '3'
services:
db:
image: mysql:5.7
platform: linux/amd64
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: rails6_docker_development
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/myapp
ports:
- "3000:3000"
depends_on:
- db
environment:
DATABASE_HOST: db
DATABASE_USER: root
DATABASE_PASSWORD: password
DATABASE_NAME: rails6_docker_development
たぶん…これで直ると思うんだけど…
~/src/rails6_docker[Use_docker(;´▽`A]
13:04 $ git diff
diff --git a/config/database.yml b/config/database.yml
index 93fb88a..e8b260d 100644
--- a/config/database.yml
+++ b/config/database.yml
@@ -27,6 +27,7 @@ development:
test:
<<: *default
database: rails6_docker_test
+ host: db
# As with config/credentials.yml, you never want to store sensitive information,
# like your database password, in your source code. If your source code is
~/src/rails6_docker[Use_docker(;´▽`A]
13:04 $
Docker上に反映されないのでしょんぼりしてます…。
docker-compose.ymlのホストマウントの設定が間違ってました><
hostの指定がなく、dbを見に行ってませんでした。
このあと無事にpending migration
エラーの画面になり…その画面からmigrationを実行して、表示されるようになりました。
Docker Desktopでコンテナをterminal経由で操作できるけど………
補完も履歴もなくてしんどい……。
日本語を保存できないので、直します…。
ChatGPTに聞きました。
docker-composeでcommandを上書きして対応するのか…。my.cnfを生成して置きに行くよりいいかもしれません。
開発環境として使う際に期待していること
必須
- エディタの変更がコンテナにすぐ反映される
- データベースを使い慣れたクライアントで操作できる
- コンテナ上のターミナルが操作しやすい
- デバッガが使える
できれば
- Dockerを導入していない場合と共存が可能である
- github上の環境で開発できるようにしたい
VSCodeのDockerからAtattch Shell
すると、なんにも設定してなかったのに、補完とか使えるようになってました…。Dockerfileでいろいろ入れなくてもいいんですね…。
(Docker Desktopのターミナルは何も設定されていないものでした。)
このターミナル上で問題なく、rspecもrubocopも動いてくれました。
コンテナ上でrails server
が動きっぱなしだから…binding.pryをやりにくそう…。
vscode-rdbgを試してみます。
stdin_open
、tty
のオプションをtrue
にしておいて…
docker ps
で名前を特定し、docker attach
するとできました。
終了するときは1ctrl-p
+ctrl+q
でした。
若干不便なのは…
VSCodeだとターミナル上でctrl+q
すると別の機能が立ち上がってしまって不便かもしれません…。
参照
vscode-rdbgはdockerといっしょには使えないのかな…。ちゃんと止まるように設定できなかったです。
必須は片付いたかなあ。
開発環境として使う際に期待していること
必須
- エディタの変更がコンテナにすぐ反映される
- データベースを使い慣れたクライアントで操作できる
- コンテナ上のターミナルが操作しやすい
- デバッガが使える
できれば
- Dockerを導入していない場合と共存が可能である
- github上の環境で開発できるようにしたい
Development/Test環境をローカルとDocker両方に対応しました。
database.ymlでerbを使えるので、ENV.fetchで切り替えられるようにしています。
次は Github Codespaces。
これ…どういうやつなん…?
- Azure上の仮想Linuxマシンのコンテナ
- コンテナのLinuxはデフォルトubuntuだけど、任意のものもOK、だけどwinとmacは使えない。
- 接続はVSCode(デスクトップ/ブラウザ)、Jetbrainsのゲートウェイアプリケーション、Github CLI
- Organizationが設定していればOrganizationに、なければ個人に課金
- 無料枠…120時間/CPUコア(最低2コアなので最長60時間)、15GB
- https://zenn.dev/dzeyelid/articles/a30a98618c40bd
エンジニアに高いマシンを配るより、GitHub Codespacesで払ったほうが安い場合も出てくるかもなぁ…。
40万円のマシン(3年くらい使う)→ 11111円/月
+開発環境のメンテナンス費 ?円
20万円のマシン(2年くらい使う)→ 8333円/月
github codespaces 2core → 3807円/月
+開発環境のメンテナンス費 ?円/開発者数
まぁ…とりあえず使ってみべえ…
リポジトリトップのCode
のところからできるのか…!
web版vscodeが立ち上がった…。
いろいろやったのにない!と思ったら、まだマージしてなかった…。
マージしよ。
docker-compose.yml の右クリックメニューから…Compose up!
動き出した…。
起動した…!
ブラウザで開く…!
ブロック…!
これ、アプリがブロックしてますね。
ローカルのブラウザから、codespacesで起動したコンテナに到達しているので、ひとまず安心。
ガイドだとここかな…。
DNSリバインディングやその他のHostヘッダー攻撃を防ぎます。 development環境ではデフォルトで以下の設定が含まれます。
むむ…?
devcontainer???
config.hostsをnilにしたら先に進んだ…。
@ken1flan ➜ /workspaces/rails6_docker (main) $ git diff config/environments/development.rb
diff --git a/config/environments/development.rb b/config/environments/development.rb
index 66df51f..cf98293 100644
--- a/config/environments/development.rb
+++ b/config/environments/development.rb
@@ -59,4 +59,6 @@ Rails.application.configure do
# Use an evented file watcher to asynchronously detect changes in source code,
# routes, locales, etc. This feature depends on the listen gem.
config.file_watcher = ActiveSupport::EventedFileUpdateChecker
+
+ config.hosts = nil
end
@ken1flan ➜ /workspaces/rails6_docker (main) $
今度はWebpacker::Manifest::MissingEntryError in Top#index
yarnがないですね…。
手元のPCのDockerのときどうなってたんだろう…?
かたづいたかな…?
開発環境として使う際に期待していること
必須
- エディタの変更がコンテナにすぐ反映される
- データベースを使い慣れたクライアントで操作できる
- コンテナ上のターミナルが操作しやすい
- デバッガが使える
できれば
- Dockerを導入していない場合と共存が可能である
- github上の環境で開発できるようにしたい
開発用のコンテナを分離できそう。
devcontainerはvscodeの機能かと思ったら、分割されて、ほかでも利用できるようになってるっぽい。
一旦、ここまででいっか…。
長くなっちゃったもんな…。