[英]Rails app using docker-compose wont connect to the mysql container
[英]Docker-compose : unable to connect to mysql from rails app first time , next run it works
我正在使用docker,docker-compose和docker-sync為Rails應用程序創建開發人員環境。 當我第一次運行docker-compose up時,它會構建我的rails應用程序的映像並下載mysql映像,但無法連接它,但是如果我退出並再次運行docker-compose up,一切都會正常進行。 這是我的碼頭工人配置
Dockerfile:
FROM ruby:2.5.1
RUN apt-get update && \
apt-get -y install sudo
RUN apt-get update && apt-get install -y \
build-essential \
nodejs \
vim \
mysql-client \
apt-transport-https \
build-essential
RUN curl -s -N https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -\
&& echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list \
&& apt-get update \
&& apt-get install -y yarn
RUN mkdir /rails-app
ENV RAILS_HOME /rails-app
WORKDIR /tmp
ADD Gemfile Gemfile
ADD Gemfile.lock Gemfile.lock
RUN bundle install
WORKDIR /rails-app
ADD . /rails-app
EXPOSE 3000
CMD ["bash"]
下面是我的碼頭工人組成
docker-compose.yml
version: '3'
services:
web:
image: "rails_app"
build: .
ports:
- "3000:3000"
env_file:
- web_env
- db_env
depends_on:
- db
command: >
bash -c "bundle exec rails db:schema:load &&
bundle exec rails db:seed &&
rm -f tmp/pids/server.pid &&
bundle exec rails s -p 3000 -b '0.0.0.0'"
db:
image: library/mysql:5.6.42
env_file:
- db_env
docker-compose dev文件用於卷同步
docker-compose-dev.yml
version: '3'
services:
web:
volumes:
- rails_app_volume_sync:/rails-app:nocopy
volumes:
rails_app_volume_sync:
external: true
docker-sync文件
docker-sync.yml
version: "2"
syncs:
rails_app_volume_sync:
src: '.'
sync_host_ip: 'auto'
sync_strategy: 'unison'
notify_terminal: true
環境文件:
web_env:
DATABASE_HOST=db
RAILS_ENV=development
db_env:
MYSQL_DATABASE=development_exp
MYSQL_ROOT_PASSWORD=root
MYSQL_USER=dev
MYSQL_PASSWORD=dev
和我的數據庫配置如下:
development:
adapter: mysql2
encoding: utf8
database: <%= ENV['MYSQL_DATABASE'] %>
username: <%= ENV['MYSQL_USER'] %>
password: <%= ENV['MYSQL_PASSWORD'] %>
host: <%= ENV['DATABASE_HOST'] %>
reconnect: true
pool: 5
當我運行docker-sync-stack start時,構建映像后出現以下錯誤。
web_1 | Mysql2::Error::ConnectionError: Can't connect to MySQL server on 'db' (111 "Connection refused")
如果我停止容器並再次運行它,它會工作,為什么它第一次失敗?
問題在於您在運行遷移之前沒有等待數據庫准備就緒。 depends_on
僅保證容器中的mysql進程已啟動,但無法知道mysql進程何時已初始化並可用於處理新連接。
一種解決方案可以是等待TCP端口啟動,其中一些使用wait-for- it。 另一個解決方案是簡單地使容器失敗並重新啟動容器,直到數據庫就緒為止(將容器的“重新啟動策略”設置為“始終”)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.