2016-09-19 103 views
6

我正在尝试构建一个docker-compose文件以在本地部署连接到mysql服务器的NodeJS应用程序。我已经尝试了一切(在Stackoverflow中阅读了很多教程和一些问题),但是我一直在收到ECONNREFUSED错误。 这是从的NodeJS我Dockerfile:NodeJS + Mysql与Docker Compose 2

##Nodejs 

FROM node:latest 

RUN useradd --user-group --create-home --shell /bin/false app 

ENV HOME=/home/app 

COPY package.json npm-shrinkwrap.json $HOME/playerground/ 
RUN chown -R app:app $HOME/* 

USER app 
WORKDIR $HOME/playerground 
RUN npm cache clean && npm install --silent --progress=false 

USER root 
COPY . $HOME/playerground 
RUN chown -R app:app $HOME/* 
USER app 

这是我的MySQL Dockerfile:

FROM mysql:latest 
 

 
ENV MYSQL_ROOT_PASSWORD root 
 
ENV MYSQL_DATABASE playerground 
 
ENV MYSQL_USER root 
 
ENV MYSQL_PASSWORD root

这是我的搬运工,撰写:

version: '2' 
 
services: 
 
    db: 
 
    build: ./database 
 
    ports: 
 
     - "3307:3306" 
 
    playerground: 
 
     build: 
 
     context: . 
 
     dockerfile: Dockerfile 
 
     command: node_modules/.bin/nodemon --exec npm start 
 
     environment: 
 
     ENVIRONMENT: development 
 
     ports: 
 
     - "9090:9090" 
 
     links: 
 
     - db 
 
     volumes:  
 
     - .:/home/app/playerground 
 
     - /home/app/playerground/node_modules

的另一件事是从我的NodeJS配置文件:

//Database 
 
'development' : { 
 
    'host' : process.env.HOSTNAME || 'localhost', 
 
    'user' : 'root', 
 
    'password' : 'root', 
 
    'database' : 'playerground' 
 
}, 
 
//Server 
 
'development' : { 
 
    'host' : process.env.HOSTNAME || '127.0.0.1', 
 
    'port' : 3000 
 
},

你能帮助我吗? 谢谢

回答

2

在您的应用程序配置中,数据库主机未指向您的MySql容器。您将其指向本地主机,即应用程序容器。在撰写文件,你可以使用显式命名的链接数据库容器:

links: 
    - db:db 

然后你的数据库容器可以在主机名db到达。您可以在您的应用配置中对该主机进行硬编码,因为它对于所有环境都是一样的,只要您使用相同的Compose文件即可。

此外,如果您使用的是最近的码头工人的版本,你不需要同泊坞网络在容器之间发布端口 - 这样你就可以从你的撰写文件中删除此:

ports: 
    - "3307:3306" 

然后数据库容器可以被应用程序容器访问,但不能在外部访问。

+0

谢谢。显然它解决了ECONNREFUSED,但它给我一个ER_HOST_NOT_PRIVILEGED错误。你有什么想法吗?谢谢! –

+0

[这个问题](http://stackoverflow.com/questions/27868965/docker-mysql-host-not-privileged)可能有答案 - 看起来像MySql用户的权限问题。尝试'授予所有特权...'为您的节点数据库用户。 –

+0

我已经试过了一个脚本,并将它添加到我的Dockerfile“ADD setup.sql /docker-entrypoint-initdb.d”但它没有工作。但我会尽力在这里继续测试。非常感谢!! –