2015-11-18 210 views
3

我正在學習Docker,並且在嘗試連接passenger-full容器和mysql容器上的Rails應用時出現問題。兩者都在撰寫文件鏈接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

這裏的問題與docker-compose.yml文件中的links指令有關。您有:

links: 
    - database 

這基本上是說,鏈接name:aliasdatabase: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 app rake db:migrate'運行成功,這意味着''rake'程序有'production'和'development'環境能夠訪問數據庫容器。但是從客軌應用程序中,我仍然無法通過套接字'/var/run/mysqld/mysqld.sock'(2)'連接到本地MySQL服務器「。我添加了'/ etc/nginx/sites-enabled/webapp.conf'文件以獲取更多詳細信息,如果您有時間查看 – mariowise

+1

那麼,我更改'mysql:latest - > mysql:5.5'和'passenger-full - >乘客ruby21'和一切工作 – mariowise

相關問題