2015-07-31 5 views
3

Связано с потоком this, я пытаюсь создать 2 контейнера: 1 с приложением для рельсов, а другой с базой данных MySQL, но я продолжаю получать Mysql2::Error (Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' в моей продукции. log file после того, как я нажму IP-адрес контейнера http://192.168.59.103Связать с Rails/Unicorn/Nginx контейнером с контейнером MySQL

Когда я запускаю контейнер rails, я пытаюсь связать их и получить ошибку, если я укажу неправильное имя MySQL. Что мне не хватает, чтобы успешно связать контейнеры, чтобы полное приложение запускалось в контейнерах?

Рельсы команда Контейнер

docker run --name games-app --link test-mysql:mysql -p 8080 -d -e SECRET_KEY_BASE=test sample_rails_games_app 
Here are my files: 

Dockerfile

# Publish port 8080 
EXPOSE 8080 

CMD ["bundle", "exec","unicorn", "-p", "8080"] 
CMD ["bunde", "exec", "rake", "db:migrate"] 

Рельсы database.yml (Dev и испытания являются такими же, как производство)

default: &default 
    adapter: mysql2 
    encoding: utf8 
    pool: 5 
    username: root 
    password: root 
    host: localhost 
    #socket: /tmp/mysql.sock 

production: 
<<: *default 
    database: weblog_production 

7/31/15 Edit

Журнал докер показывает единорога запустить сервер:

docker logs a13bf7851c6d 
I, [2015-07-31T18:10:59.860203 #1] INFO -- : listening on addr=0.0.0.0:8080 fd=9 
I, [2015-07-31T18:10:59.860583 #1] INFO -- : worker=0 spawning... 
I, [2015-07-31T18:10:59.864143 #1] INFO -- : master process ready 
I, [2015-07-31T18:10:59.864859 #7] INFO -- : worker=0 spawned pid=7 
I, [2015-07-31T18:10:59.865097 #7] INFO -- : Refreshing Gem list 
I, [2015-07-31T18:11:01.796690 #7] INFO -- : worker=0 ready 

7/31/15 Решение Благодаря @Rico

  1. db:migrate был у меня проблемы с запуском, поэтому я в конечном счете провел его вручную в команде docker run. Удостоверьтесь, что вы сделали это после того, как контейнер уже создан или во время процесса создания, так как ему требуется привязка к контейнеру DB.
  2. Это linking article помогло мне понять, что моя ссылка не была создана, поэтому некорректно общаться.
  3. После того, как я понял, как точно сделать ссылку, я обновить мою database.yml с хостом и портом значения
  4. Используйте эту команду, чтобы проверить имена ваших переменных ENV docker run --rm --name <unique-value> --link <db-name> <non-db-image> env.
  5. Используйте это, чтобы увидеть значение ссылки в вашем приложении контейнера docker inspect -f "{{ .HostConfig.Links }}" <app-name>
+0

Я должен дать этот вопрос 10 взлетов ... он спас мой день –

ответ

2

Собственно ваш bundle exec unicorn -p 8080CMD является заменяющий bundle exec rake db:migrate как это не вернуть.

Сначала вы должны запустить свой db:migrate, и вы должны запустить его с помощью команды RUN, так как CMD является основной командой в докере.

Но другая проблема с вашим файлом database.yml. Вы указываете свой db на сервер db, который работает в том же контейнере, что и в приложении. Вы должны заполнить значения вашего database.yml из переменных env, созданных после связывания исходного контейнера (приложения) с контейнером назначения (контейнер сервера db). Переменные env создаются в контейнере источника.

Больше информации здесь: https://docs.docker.com/userguide/dockerlinks/

Так, например:

$ docker run --rm --name web2 --link db:db training/webapp env 
. . . 
DB_NAME=/web2/db 
DB_PORT=tcp://172.17.0.5:5432 
DB_PORT_5432_TCP=tcp://172.17.0.5:5432 
DB_PORT_5432_TCP_PROTO=tcp 
DB_PORT_5432_TCP_PORT=5432 
DB_PORT_5432_TCP_ADDR=172.17.0.5 

Ваш database.yml должен выглядеть примерно так:

default: &default 
    adapter: mysql2 
    encoding: utf8 
    pool: 5 
    database: <%= ENV['DB_NAME'] %> 
    username: root 
    password: root 
    host: <%= ENV['DB_PORT_5432_TCP_ADDR'] %> 
    port: <%= ENV['DB_PORT_5432_TCP_PORT'] %> 
+1

Вы выиграли золотую звезду на сегодня! Это доставило мне большую часть пути, и я наконец смог связать с контейнером БД с измененной командой и проверить эту ссылку. В конечном итоге мне пришлось запустить команду db: create в другой команде запуска Docker, поэтому я должен, скорее всего, просто упаковать ее в Dockerfile. Большое вам спасибо за вашу помощь! Обновлены команды, приходящие к исходному сообщению. – smugcloud

1

Вы не можете иметь 2 команды CMD в вашем Dockerfile, на самом деле только последний сохраняется. Команда ЦМД выполнена является `

ЦМД [ "Bunde", "Exec", "грабли", "дб: мигрировать"]`

другой,

CMD ["bundle", "exec","unicorn", "-p", "8080"]

вытесняется ,

См Supervisor

https://docs.docker.com/articles/using_supervisord/

, если вы хотите запустить более одного rocess в контейнере, или запустить 2 Differnet контейнеры

+0

Спасибо @ user2915097. Я не был полностью уверен в этом, но проблема все еще сохраняется, если у меня только команда единорога, а сервер единорога работает в любом случае. – smugcloud

Смежные вопросы