Docker MySQL无法连接到套接字

mar*_*ise 5 mysql ruby-on-rails passenger nginx docker

我正在学习Docker,尝试在passenger-full容器和mysql容器上连接Rails应用程序时遇到问题。两者都链接在撰写文件中

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"
Run Code Online (Sandbox Code Playgroud)

所以我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/*
Run Code Online (Sandbox Code Playgroud)

这也是我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
Run Code Online (Sandbox Code Playgroud)

问题是我无法停止接收错误

Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?如您所见,我是Docker的新手。

Ric*_*ico 5

这里的问题是文件中的links指令docker-compose.yml。你有:

links:
  - database
Run Code Online (Sandbox Code Playgroud)

根据参考文献,这基本上就是说链接name:alias是。database:databasedocker-compose.yml

另外,如果您阅读了链接容器文档,则可以看到导出到源容器的环境的格式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
Run Code Online (Sandbox Code Playgroud)

如果要使用MYSQL别名,则链接必须在docker-compose.yml文件中看起来像这样。

links:
  - database:mysql
Run Code Online (Sandbox Code Playgroud)

错误:

Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
Run Code Online (Sandbox Code Playgroud)

基本上是从您的Rails应用程序发出的,不是要查看database.yml中的内容,而是默认为本地/var/run/mysqld/mysqld.sock连接。

希望能帮助到你。