解決したいこと
Heroku上にDockerを使用してデプロイしたのですが、heroku run bundle exec rake db:migrateが失敗してしまいます。エラーが長いので詳細はコメントで書きます
発生している問題・エラー
senseiy@senseIY-wsl:~/Portfolio$ heroku run bundle exec rake db:migrate RAILS_ENV=production -a dictum-app --trace › Warning: heroku update available from 7.59.4 to 7.60.0. Running bundle exec rake db:migrate RAILS_ENV=production --trace on ⬢ dictum-app... up, run.4841 (Free) ** Invoke db:migrate (first_time) ** Invoke db:load_config (first_time) ** Invoke environment (first_time) ** Execute environment ** Execute db:load_config ** Execute db:migrate rake aborted! ActiveRecord::ConnectionNotEstablished: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) /usr/local/bundle/gems/activerecord-6.1.5/lib/active_record/connection_adapters/mysql2_adapter.rb:45:in `rescue in new_client' /usr/local/bundle/gems/activerecord-6.1.5/lib/active_record/connection_adapters/mysql2_adapter.rb:39:in `new_client' /usr/local/bundle/gems/activerecord-6.1.5/lib/active_record/connection_adapters/mysql2_adapter.rb:23:in `mysql2_connection' /usr/local/bundle/gems/activerecord-6.1.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:882:in `public_send' /usr/local/bundle/gems/activerecord-6.1.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:882:in `new_connection' /usr/local/bundle/gems/activerecord-6.1.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:926:in `checkout_new_connection' /usr/local/bundle/gems/activerecord-6.1.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:905:in `try_to_checkout_new_connection' /usr/local/bundle/gems/activerecord-6.1.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:866:in `acquire_connection' /usr/local/bundle/gems/activerecord-6.1.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:588:in `checkout' /usr/local/bundle/gems/activerecord-6.1.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:428:in `connection' /usr/local/bundle/gems/activerecord-6.1.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:1128:in `retrieve_connection' /usr/local/bundle/gems/activerecord-6.1.5/lib/active_record/connection_handling.rb:327:in `retrieve_connection' /usr/local/bundle/gems/activerecord-6.1.5/lib/active_record/connection_handling.rb:283:in `connection' /usr/local/bundle/gems/activerecord-6.1.5/lib/active_record/tasks/database_tasks.rb:237:in `migrate' /usr/local/bundle/gems/activerecord-6.1.5/lib/active_record/railties/databases.rake:92:in `block (3 levels) in <main>' /usr/local/bundle/gems/activerecord-6.1.5/lib/active_record/railties/databases.rake:90:in `each' /usr/local/bundle/gems/activerecord-6.1.5/lib/active_record/railties/databases.rake:90:in `block (2 levels) in <main>' /usr/local/bundle/gems/rake-13.0.6/lib/rake/task.rb:281:in `block in execute' /usr/local/bundle/gems/rake-13.0.6/lib/rake/task.rb:281:in `each' /usr/local/bundle/gems/rake-13.0.6/lib/rake/task.rb:281:in `execute' /usr/local/bundle/gems/rake-13.0.6/lib/rake/task.rb:219:in `block in invoke_with_call_chain' /usr/local/bundle/gems/rake-13.0.6/lib/rake/task.rb:199:in `synchronize' /usr/local/bundle/gems/rake-13.0.6/lib/rake/task.rb:199:in `invoke_with_call_chain' /usr/local/bundle/gems/rake-13.0.6/lib/rake/task.rb:188:in `invoke' /usr/local/bundle/gems/rake-13.0.6/lib/rake/application.rb:160:in `invoke_task' /usr/local/bundle/gems/rake-13.0.6/lib/rake/application.rb:116:in `block (2 levels) in top_level' /usr/local/bundle/gems/rake-13.0.6/lib/rake/application.rb:116:in `each' /usr/local/bundle/gems/rake-13.0.6/lib/rake/application.rb:116:in `block in top_level' /usr/local/bundle/gems/rake-13.0.6/lib/rake/application.rb:125:in `run_with_threads' /usr/local/bundle/gems/rake-13.0.6/lib/rake/application.rb:110:in `top_level' /usr/local/bundle/gems/rake-13.0.6/lib/rake/application.rb:83:in `block in run' /usr/local/bundle/gems/rake-13.0.6/lib/rake/application.rb:186:in `standard_exception_handling' /usr/local/bundle/gems/rake-13.0.6/lib/rake/application.rb:80:in `run' /usr/local/bundle/gems/rake-13.0.6/exe/rake:27:in `<top (required)>' /usr/local/bundle/bin/rake:25:in `load' /usr/local/bundle/bin/rake:25:in `<top (required)>' /usr/local/lib/ruby/3.0.0/bundler/cli/exec.rb:58:in `load' /usr/local/lib/ruby/3.0.0/bundler/cli/exec.rb:58:in `kernel_load' /usr/local/lib/ruby/3.0.0/bundler/cli/exec.rb:23:in `run' /usr/local/lib/ruby/3.0.0/bundler/cli.rb:478:in `exec' /usr/local/lib/ruby/3.0.0/bundler/vendor/thor/lib/thor/command.rb:27:in `run' /usr/local/lib/ruby/3.0.0/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command' /usr/local/lib/ruby/3.0.0/bundler/vendor/thor/lib/thor.rb:392:in `dispatch' /usr/local/lib/ruby/3.0.0/bundler/cli.rb:31:in `dispatch' /usr/local/lib/ruby/3.0.0/bundler/vendor/thor/lib/thor/base.rb:485:in `start' /usr/local/lib/ruby/3.0.0/bundler/cli.rb:25:in `start' /usr/local/lib/ruby/gems/3.0.0/gems/bundler-2.2.32/libexec/bundle:49:in `block in <top (required)>' /usr/local/lib/ruby/3.0.0/bundler/friendly_errors.rb:103:in `with_friendly_errors' /usr/local/lib/ruby/gems/3.0.0/gems/bundler-2.2.32/libexec/bundle:37:in `<top (required)>' /usr/local/bin/bundle:23:in `load' /usr/local/bin/bundle:23:in `<main>' Caused by: Mysql2::Error::ConnectionError: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) /usr/local/bundle/gems/mysql2-0.5.3/lib/mysql2/client.rb:90:in `connect' /usr/local/bundle/gems/mysql2-0.5.3/lib/mysql2/client.rb:90:in `initialize' /usr/local/bundle/gems/activerecord-6.1.5/lib/active_record/connection_adapters/mysql2_adapter.rb:40:in `new' /usr/local/bundle/gems/activerecord-6.1.5/lib/active_record/connection_adapters/mysql2_adapter.rb:40:in `new_client' /usr/local/bundle/gems/activerecord-6.1.5/lib/active_record/connection_adapters/mysql2_adapter.rb:23:in `mysql2_connection' /usr/local/bundle/gems/activerecord-6.1.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:882:in `public_send' /usr/local/bundle/gems/activerecord-6.1.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:882:in `new_connection' /usr/local/bundle/gems/activerecord-6.1.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:926:in `checkout_new_connection' /usr/local/bundle/gems/activerecord-6.1.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:905:in `try_to_checkout_new_connection' … … /usr/local/bundle/gems/rake-13.0.6/lib/rake/application.rb:80:in `run' /usr/local/bundle/gems/rake-13.0.6/exe/rake:27:in `<top (required)>' /usr/local/bundle/bin/rake:25:in `load' /usr/local/bundle/bin/rake:25:in `<top (required)>' /usr/local/lib/ruby/3.0.0/bundler/cli/exec.rb:58:in `load' /usr/local/lib/ruby/3.0.0/bundler/cli/exec.rb:58:in `kernel_load' /usr/local/lib/ruby/3.0.0/bundler/cli/exec.rb:23:in `run' /usr/local/lib/ruby/3.0.0/bundler/cli.rb:478:in `exec' /usr/local/lib/ruby/3.0.0/bundler/vendor/thor/lib/thor/command.rb:27:in `run' /usr/local/lib/ruby/3.0.0/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command' /usr/local/lib/ruby/3.0.0/bundler/vendor/thor/lib/thor.rb:392:in `dispatch' /usr/local/lib/ruby/3.0.0/bundler/cli.rb:31:in `dispatch' /usr/local/lib/ruby/3.0.0/bundler/vendor/thor/lib/thor/base.rb:485:in `start' /usr/local/lib/ruby/3.0.0/bundler/cli.rb:25:in `start' /usr/local/lib/ruby/gems/3.0.0/gems/bundler-2.2.32/libexec/bundle:49:in `block in <top (required)>' /usr/local/lib/ruby/3.0.0/bundler/friendly_errors.rb:103:in `with_friendly_errors' /usr/local/lib/ruby/gems/3.0.0/gems/bundler-2.2.32/libexec/bundle:37:in `<top (required)>' /usr/local/bin/bundle:23:in `load' /usr/local/bin/bundle:23:in `<main>' Tasks: TOP => db:migrate
### 環境
・Rails6.15 Ruby3.0.3 開発環境はDocker wsl2
・デプロイはHerokuにしました。
### ソースコード
```
### dockerfile
FROM ruby:3.0.3-buster
ENV RAILS_ENV=production
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 && \
apt-get update -qq && \
apt-get install -y --no-install-recommends \
build-essential \
nodejs \
yarn
WORKDIR /app
COPY ./src /app
# Gemfile.lockを更新するため一度bundle install
RUN bundle config --local set path 'vender/bundle'
RUN bundle install
ENV NODE_VERSION 15.0.1
RUN ARCH= && dpkgArch="$(dpkg --print-architecture)" \
&& case "${dpkgArch##*-}" in \
amd64) ARCH='x64';; \
ppc64el) ARCH='ppc64le';; \
s390x) ARCH='s390x';; \
arm64) ARCH='arm64';; \
armhf) ARCH='armv7l';; \
i386) ARCH='x86';; \
*) echo "unsupported architecture"; exit 1 ;; \
esac \
&& set -ex \
&& curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-$ARCH.tar.xz" \
&& tar -xJf "node-v$NODE_VERSION-linux-$ARCH.tar.xz" -C /usr/local --strip-components=1 --no-same-owner \
&& rm "node-v$NODE_VERSION-linux-$ARCH.tar.xz" \
&& ln -s /usr/local/bin/node /usr/local/bin/nodejs \
&& node --version \
&& npm --version
COPY start.sh /start.sh
RUN chmod 744 /start.sh
CMD ["sh", "/start.sh"]
# docker-compose.yml
version: '3'
services:
db:
image: mysql:8.0.28
container_name: "dictum_mysql"
command: --default-authentication-plugin=mysql_native_password
volumes:
- ./src/db/mysql_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: password
web:
build: .
container_name: "dictum_rails"
command: /bin/bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
volumes:
- ./src:/app
ports:
- "3000:3000"
depends_on:
- db
- chrome
stdin_open: true
tty: true
environment:
SELENIUM_REMOTE_URL: http://chrome:4444/wd/hub
chrome:
# image: selenium/standalone-chrome:latest
image: selenium/standalone-chrome-debug:latest
ports:
- 4444:4444
- 5900:5900
#start.sh
#!/bin/sh
if [ "${RAILS_ENV}" = "production" ]
then
bundle exec rails assets:precompile
fi
bundle exec rails s -p ${PORT:-3000} -b 0.0.0.0
```
# database.yml
default: &default
adapter: mysql2
encoding: utf8mb4
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password: password
host: db
socket: /var/run/mysqld/mysqld.sock
development:
<<: *default
database: app_development
# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
<<: *default
database: app_test
# 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
# ever seen by anyone, they now have access to your database.
#
# Instead, provide the password or a full connection URL as an environment
# variable when you boot the app. For example:
#
# DATABASE_URL="mysql2://myuser:mypass@localhost/somedatabase"
#
# If the connection URL is provided in the special DATABASE_URL environment
# variable, Rails will automatically merge its configuration values on top of
# the values provided in this file. Alternatively, you can specify a connection
# URL environment variable explicitly:
#
# production:
# url: <%= ENV['MY_APP_DATABASE_URL'] %>
#
# Read https://guides.rubyonrails.org/configuring.html#configuring-a-database
# for a full overview on how database connection configuration can be specified.
#
production:
<<: *default
database: <%= ENV['APP_DATABASE'] %>
username: <%= ENV['APP_DATABASE_USERNAME'] %>
password: <%= ENV['APP_DATABASE_PASSWORD'] %>
host: <%= ENV['APP_DATABASE_HOST'] %>
```
### 自分で試したことや考察など
・ローカル環境ではdocker-compose exec web bundle exec rake db:migrateは成功します。なのでherokuの設定か環境変数辺りが怪しいです。
・Dockerではmysqlのバージョンは8系を使っていますがherokuでは5系を使っていることが原因かもしれません。5系にグレードダウンすることも考えましたが、dbの整合性がおかしくなり、問題が複雑化する可能性があると考えたのでまだやっていません。また、herokuの8系は有料なうえ、たとえ8系にしても直る保証はないのでmysqlのバージョンを変更するのはどうしても解決しない時にしたいです。
・heroku open -a dictum-app では接続はできており一応開くことはできますが、保存した画像がでないです。
何かしらアドバイスがあればよろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー