8

I try to dockerlized my own node application, but can't connect the mysql container. my codes:

docker-compose.yml

  version: '3.2'
  services:
    node:
      build: ./
      ports:
        - "8787:8787"
      depends_on:
        - db
      networks:
        - docker_xxx
      environment:
        - PORT=8787
        - DATABASE_HOST=db
        - DATABASE_PASSWORD=xxx
        - EGG_SERVER_ENV=local
        - NODE_ENV=development
      # command: ["./wait-for-it.sh", "db:3306", "--", "npm run docker"]
    db:
      build: ./db
      networks:
        - docker_xxx
      environment:
        - MYSQL_ROOT_PASSWORD=xxx
        - MYSQL_DATABASE=database
        - MYSQL_USER=user
        - MYSQL_PASSWORD=passwd

  networks:
    docker_xxx:
      driver: bridge

./Dockerfile (for nodejs)

  FROM node:8.9.4-alpine

  RUN mkdir -p /usr/src/app

  WORKDIR /usr/src/app

  COPY package.json /usr/src/app/

  RUN npm install --production

  COPY . /usr/src/app
  # COPY wait-for-it.sh /usr/src/app

  EXPOSE 8787

  CMD npm run docker

db/Dockerfile (for mysql)

  FROM mysql:5.6

  ADD honggang.sql /docker-entrypoint-initdb.d

config/config.default.js

 config.mysql = {
    // mysql settings
    client: {
      // host
      host: process.env.DATABASE_HOST || '127.0.0.1',
      // port
      port: '3306',
      // username
      user: 'root',
      // password
      password: 'xxx',
      database: 'xxx',
      charset: 'utf8',
      dialectOptions: {
        collate: 'utf8_general_ci',
      },
    },
    app: true,
    agent: false,
  };

I run docker-compose up -d , there's only db running.

I run docker logs hash to find errors, it shows the following info:

        2018-04-30 14:43:51,334 ERROR 54 nodejs.ECONNREFUSEDError: connect ECONNREFUSED 172.19.0.2:3306
            at Object._errnoException (util.js:1022:11)
            at _exceptionWithHostPort (util.js:1044:20)
            at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1182:14)
            --------------------
            at Protocol._enqueue (/usr/src/app/node_modules/mysql/lib/protocol/Protocol.js:145:48)
            at Protocol.handshake (/usr/src/app/node_modules/mysql/lib/protocol/Protocol.js:52:23)
            at PoolConnection.connect (/usr/src/app/node_modules/mysql/lib/Connection.js:130:18)
            at Pool.getConnection (/usr/src/app/node_modules/mysql/lib/Pool.js:48:16)
            at /usr/src/app/node_modules/ali-rds/node_modules/pify/index.js:29:7
            at new Promise (<anonymous>)
            at Pool.<anonymous> (/usr/src/app/node_modules/ali-rds/node_modules/pify/index.js:12:10)
            at Pool.ret [as getConnection] (/usr/src/app/node_modules/ali-rds/node_modules/pify/index.js:56:34)
            at Pool.query (/usr/src/app/node_modules/mysql/lib/Pool.js:202:8)
            at /usr/src/app/node_modules/ali-rds/node_modules/pify/index.js:29:7
            sql: select now() as currentTime;
        code: 'ECONNREFUSED'
        errno: 'ECONNREFUSED'
        syscall: 'connect'
        address: '172.19.0.2'
        port: 3306
        fatal: true
        name: 'ECONNREFUSEDError'
        pid: 54
        hostname: d9cd95667a5d

I added CMD ping db, it responded.


I tried to use wait-for-it.sh (the code just commented out), but got the error info:

env: can't execute 'bash': No such file or directory
2
  • host: process.env.DATABASE_HOST || '127.0.0.1', => host: 'db' That's how I do it at least Commented Apr 30, 2018 at 17:42
  • oh nvm, I saw the environment variable. Check that it contains 'db'. Also this database: 'xxx', Commented Apr 30, 2018 at 17:43

1 Answer 1

5

I solved https://github.com/ycjcl868/eggjs-mysql-docker

there are the points:
1. apk add --no-cache bash to run the wait-for-it.sh waiting the mysql server is ok
2. hostname is 0.0.0.0 not localhost/127.0.0.1

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.