2016-09-19 25 views
6

Tôi đang cố gắng xây dựng một tệp docker-compose để triển khai cục bộ ứng dụng NodeJS của tôi kết nối với máy chủ mysql. Tôi đã thử tất cả mọi thứ (đọc rất nhiều hướng dẫn và một số câu hỏi ở đây trong Stackoverflow) nhưng tôi tiếp tục nhận được lỗi ECONNREFUSED. Đây là Dockerfile tôi từ NodeJS:NodeJS + Mysql với Docker Soạn 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 

Đây là Mysql Dockerfile tôi:

FROM mysql:latest 
 

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

Và đây là của tôi Docker-soạn:

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

Một điều nữa là tập tin cấu hình của tôi từ 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 
 
},

Bạn có thể giúp tôi? Cảm ơn

Trả lời

2

Trong cấu hình ứng dụng của bạn, máy chủ cơ sở dữ liệu không trỏ vào vùng chứa MySql của bạn. Bạn đang trỏ nó vào máy chủ lưu trữ cục bộ, đó là vùng chứa ứng dụng. Trong tập tin Soạn bạn có thể đặt tên một cách rõ ràng liên kết đến container db sử dụng:

links: 
    - db:db 

Và sau đó chứa cơ sở dữ liệu của bạn có thể đạt được tại hostname db. Bạn có thể mã hóa máy chủ lưu trữ đó trong cấu hình ứng dụng của mình, vì nó sẽ giống nhau đối với tất cả các môi trường, miễn là bạn sử dụng cùng một tệp Soạn thư.

Ngoài ra, nếu bạn đang sử dụng một phiên bản gần đây của Docker bạn không cần phải công bố các cảng container giữa trong mạng Docker cùng - vì vậy bạn có thể loại bỏ điều này từ file Soạn bạn:

ports: 
    - "3307:3306" 

Sau đó, thùng chứa db sẽ có thể truy cập được bởi vùng chứa ứng dụng, nhưng không thể truy cập từ bên ngoài.

+0

Cảm ơn. Rõ ràng nó giải quyết được ECONNREFUSED nhưng nó cho tôi một lỗi ER_HOST_NOT_PRIVILEGED. Bạn có bất kỳ ý tưởng về những gì đang xảy ra? Cảm ơn! –

+0

[Câu hỏi này] (http://stackoverflow.com/questions/27868965/docker-mysql-host-not-privileged) có thể có câu trả lời - trông giống như một vấn đề quyền với người dùng MySql. Hãy thử 'GRANT ALL PRIVILEGES ...' cho người dùng db nút của bạn. –

+0

Tôi đã thử với một kịch bản và thêm nó vào Dockerfile của tôi "ADD setup.sql /docker-entrypoint-initdb.d" nhưng nó không hoạt động. Nhưng tôi sẽ cố gắng tiếp tục thử nghiệm ở đây. Cảm ơn rất nhiều!! –

Các vấn đề liên quan