最近仕事でrails newを実行するとこからAPIサーバ2つ作った。その際の設定作業メモ
使った技術やバージョンざっくり
key | val |
---|---|
Dockerのbaseイメージ | ruby:3.0.2-alpine3.14 |
Railsのバージョン | 6.1.4 |
DB | 片方がPostgresql、もう一方がMySQL |
注意点
- rails newする時にオプションをつけないと初期設定が面倒
- rubyのイメージがalpineの場合、postgre、mysqlへの接続用ライブラリをdockerイメージ内で追加する必要あり
- 別のdockerコンテナで立ち上がってるサービスにアクセスするにはconfigでdockerのDNSからのアクセスを許可する必要あり
rails newする時にオプションをつけないと初期設定が面倒
デフォルトだと要件に合わないのでオプションをつけてrails newすると初期設定が大分楽になる
- デフォルトだとDBがSQLite→今回はPostgreSQLとMySQLを使いたい
- デフォルトだとテストフレームワークがminitest→rspecを使いたい
- デフォルトだとerbやアセットパイプラインなどフロントフロントエンド開発に必要なライブラリもインストールされる→今回APIサーバが欲しいだけなのでいれたくない
実行したコマンド
rails new samle-api-app --api -d postgresql --skip-test
-dオプションでDB接続に必要なライブラリの追加、--skip-testでminitestのインストールスキップ、apiオプションでフロントエンドライブラリのインストールをスキップしてくれる。
rubyのイメージがalpineの場合、postgre、mysqlへの接続用ライブラリをdockerイメージ内で追加する必要あり
Dockerfileに以下追加が必要。alpineの場合これがないとDBに接続できない
# PostgreSQLの場合 RUN apk update \ && apk add \ postgresql-client \ postgresql \ postgresql-dev # MySQLの場合 RUN apk update \ && apk add \ mysql-client \ mysql-dev
別のdockerコンテナで立ち上がってるサービスにアクセスするにはconfigでdockerのDNSからのアクセスを許可する必要あり
別のDockerコンテナにhost.docker.internal
というDocker内のDNSで接続したかったんだけどやってみると403エラーになった。
調べたところRails6からconfigに設定追加しないと接続できないらしい。
config/environments/development.rb
に以下追記
config.hosts << "host.docker.internal"
これでこんな感じでHTTPリクエスト送ったりできる
Faraday.get("http://host.docker.internal:3000/api/v1/sample")
参考