我正在尝试另一种将Rails应用程序构建到Docker镜像中的方法。
我的服务结构:
我创建了两个Dockerfile,例如:
Dockerfile.sidekiq
FROM ruby:2.2.2
ENV APP_HOME /myapp
RUN mkdir $APP_HOME
WORKDIR $APP_HOME
ADD Gemfile $APP_HOME/Gemfile
ADD Gemfile.lock $APP_HOME/Gemfile.lock
ADD config/sidekiq.yml $APP_HOME/config/sidekiq.yml
ADD init_sidekiq.sh $APP_HOME/
RUN export LANG=C.UTF-8 && bundle install
ADD . $APP_HOME
CMD ["sh", "init_sidekiq.sh"]
init_sidekiq.sh
#!/bin/sh
bundle exec sidekiq -C config/sidekiq.yml
Dockerfile.web
FROM rails:4.2.1
ENV APP_HOME /myapp
RUN mkdir $APP_HOME
WORKDIR $APP_HOME
ADD Gemfile $APP_HOME/Gemfile
ADD Gemfile.lock $APP_HOME/Gemfile.lock
ADD init_web.sh $APP_HOME/
RUN export LANG=C.UTF-8 && bundle install
ADD . $APP_HOME
CMD ["sh", "init_web.sh"]
init_web.sh
#!/bin/sh
bundle exec rake db:create db:migrate
bundle exec rails server -b 0.0.0.0
使用它们,我构建了两个图像:
然后运行以下容器:
$ docker run --name redis -d redis
$ docker run --name fluentd -d -p 24224:24224 fluent/fluentd
$ docker run --name mysql -e MYSQL_ROOT_PASSWORD=my_password -d mysql
制作环境 list
RAILS_ENV=production
DATABASE_URL=mysql2://root:[email protected]/myapp?checkout_timeout=20000
继续运行以下容器:
$ docker run --name web -d -p 3000:3000 --link mysql:mysql --env-file ./env.list myapp_web
$ docker run --name sidekiq -d --link mysql:mysql --env-file ./env.list myapp_sidekiq
结果:
sidekiq日志:
$ docker logs sidekiq
Unknown database 'myapp'
/usr/local/bundle/gems/activerecord-4.2.1/lib/active_record/connection_adapters/mysql2_adapter.rb:23:in `rescue in mysql2_connection'
我使用相同的方法通过web和sidekiq连接mysql。我相信在mysql容器中存在一个
myapp
数据库。但是为什么找不到它呢?使它们成为两个容器是错误的方法吗?如何正确运行sidekiq?
最佳答案
我认为问题在于您如何连接到Redis?该消息似乎来自sidekiq,并且某种程度上无法连接到您的Redis服务器。 (而且我认为尝试连接到某些虚假的数据库服务器/数据库)
因此,我认为您需要将sidekiq容器链接到db容器和redis容器。
docker run --name sidekiq -d --link mysql:mysql --link redis:redis --env-file ./env.list myapp_sidekiq
另外,如果您可以共享
env.list
,那就太好了关于mysql - 如何使用Docker构建Sidekiq和Rails镜像?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33770402/