2015-11-18 2 views
3

Я изучаю Docker, и у меня есть проблема с подключением приложения Rails на контейнере passenger-full и контейнере mysql. Оба связаны в файле создания письмаDocker MySQL не может подключиться к сокете

app: 
    build: ./rails 
    ports: 
    - "80:80" 
    links: 
    - database 
    volumes: 
    - ./rails:/home/app/webapp 
database: 
    image: mysql 
    environment: 
    - MYSQL_DATABASE="dockertest" 
    - MYSQL_USER="dockertest" 
    - MYSQL_PASSWORD="dockertest" 
    - MYSQL_ROOT_PASSWORD="root" 

Так я добавил apt-get install в верхней части моей Dockerfile как этот

FROM phusion/passenger-full 
RUN apt-get update && apt-get install libmysqlclient-dev mysql-client -y 

# Set correct environment variables. 
ENV HOME /root 

# Use baseimage-docker's init process. 
CMD ["/sbin/my_init"] 

RUN rm -f /etc/service/nginx/down 
RUN rm /etc/nginx/sites-enabled/default 
ADD webapp.conf /etc/nginx/sites-enabled/webapp.conf 

RUN mkdir /home/app/webapp 
WORKDIR /home/app/webapp 
ADD . /home/app/webapp 
RUN cd /home/app/webapp && bundle install 
RUN touch /home/app/webapp/tmp/restart.txt 

# Clean up APT when done. 
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 

Кроме того, это мой database.yml в приложении Rails.

default: &default 
    adapter: mysql2 
    database: dockertest 
    host: <%= ENV['MYSQL_PORT_3306_TCP_ADDR'] %> 
    port: <%= ENV['MYSQL_PORT_3306_TCP_PORT'] %> 
    username: dockertest 
    password: dockertest 

development: 
    <<: *default 

production: 
    <<: *default 

Проблема заключается в том, что я не могу прекратить получать ошибку

Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) 

Файл webconf является

# /etc/nginx/sites-enabled/webapp.conf: 
server { 
    listen 80; 
    server_name localhost; 
    root /home/app/webapp/public; 

    passenger_enabled on; 
    passenger_user app; 
    passenger_ruby /usr/bin/ruby2.2; 
} 

Это правильный способ сделать это? Как вы можете видеть, я довольно новичок в докере.

ответ

3

Проблема здесь с директивой links в вашем файле docker-compose.yml. У вас есть:

links: 
    - database 

Это в основном говорят, что связь name:alias является database:database, согласно docker-compose.ymlreference.

Кроме того, если вы читаете linking container docs, вы можете видеть, что среды, экспортированные в исходный контейнер, имеют формат ALIAS_XXX, например ALIAS_PORT_3306_TCP_PORT. Таким образом, в сущности, в вашем database.yml то, что вы хотите сделать что-то вроде этого:

default: &default 
    adapter: mysql2 
    database: dockertest 
    host: <%= ENV['DATABASE_PORT_3306_TCP_ADDR'] %> 
    port: <%= ENV['DATABASE_PORT_3306_TCP_PORT'] %> 
    username: dockertest 
    password: dockertest 

development: 
    <<: *default 

production: 
    <<: *default 

Если вы хотите использовать MYSQL псевдоним ваши ссылки будут иметь, чтобы выглядеть как это в вашем файле docker-compose.yml.

links: 
    - database:mysql 

Ошибка:

Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) 

в основном приходит из вашего приложения Rails не в том, чтобы увидеть, что в вашем database.yml и недобросовестных к местной /var/run/mysqld/mysqld.sock связи.

Надеюсь, что это поможет.

+0

Я хотел бы поблагодарить вас за помощь, особенно за уровень детализации и хорошее объяснение. Теперь успешно выполняется команда docker-compose run rake db: migrate', что означает, что программа 'rake' с средами' production' и 'development' может достигать контейнера базы данных. Но из приложения для пассажирских рельсов я все еще получаю сообщение 'Can not connect to local MySQL server через socket '/var/run/mysqld/mysqld.sock' (2)' error. Я добавил файл '/ etc/nginx/sites-enabled/webapp.conf' для более подробной информации, если у вас есть время, чтобы взглянуть на него – mariowise

+1

Ну, я меняю' mysql: latest -> mysql: 5.5' и 'full-full -> пассажир-рубин21' и все работало – mariowise

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