2016-06-10 87 views
4

我是码头工人,我试图让我的nodejs运行在它里面。 我想安装使用shellscript及其工作的依赖关系,但最终我无法连接到MySQL。无法在同一个码头中连接nodejs和mysql

我的docker文件安装mysql,创建用户和数据库,并安装nodejs。 然后运行NPM安装并尝试启动我的应用程序,但knex说,它无法与消息连接到MySQL:

Knex:Error Pool2 - Error: connect ECONNREFUSED /var/run/mysqld/mysqld.sock 

这里与我使用的代码要点。 (部分的NodeJS是不完整的,只是重要的部分):

https://gist.github.com/jradesenv/527f6e59ab2e7985c38fbed3a2084c83

我希望所有人都对如何解决或debbug这是一个很好IDEIA。

回答

3

码头集装箱被设计为运行一个命令。 mysql安装程序希望它注册的服务能够在操作系统启动时自动启动,但容器内部并非如此。

正确的解决方案是将它们分成两个单独的容器,一个数据库容器和另一个nodejs/app容器。链接并运行这两者以及自动设置主机名的docker-compose配置。

较不理想的选项是supervisord,您可以使用它来运行和管理容器内的多个进程。您可以像安装任何其他应用程序一样安装它,将您的数据库和节点应用程序配置为supervisord管理的两个服务,然后启动supervisord作为您的容器的运行命令。

4

最佳做法是将微服务的组件分开存放在自己的容器中。

参见例如“Learn Docker by building a Microservice”从Dave Kerr

enter image description here

他确实申报两项服务:

version: '2' 
services: 
    users-service: 
    build: ./users-service 
    ports: 
    - "8123:8123" 
    depends_on: 
    - db 
    environment: 
    - DATABASE_HOST=db 
    db: 
    build: ./test-database 

有了一个专门的Dockerfile数据库:

FROM mysql:5 

ENV MYSQL_ROOT_PASSWORD 123 
ENV MYSQL_DATABASE users 
ENV MYSQL_USER users_service 
ENV MYSQL_PASSWORD 123 

ADD setup.sql /docker-entrypoint-initdb.d 
+0

试过这个,我得到ECONNREFUSED 127.0.0.1:3306错误。 我撰写文件: 版本: '2' 服务: DB: 编译:./database 揭露: - “3306” 端口: - “3307:3306” playerground: 编译: 背景:。 dockerfile:Dockerfile command:node_modules /。斌/ nodemon --exec NPM启动 环境: - DATABASE_HOST = DB 端口: - “9090:9090” depends_on: - DB 卷: - :/首页/应用/ playerground - /家用/ app/playerground/node_modules –

+0

@ThiagoMirandadeOliveira有趣。最好将其作为更多调查的新问题发布。 – VonC

+0

http://stackoverflow.com/questions/39581438/nodejs-mysql-with-docker-compose-2 –

1

使用泊坞窗,撰写并为您的NodeJS和一个创建dockerfile为MySQL。每个容器都负责做他们的事情。在你的作文中,链接它们。然后将你的nodejs db连接指向mysql容器。