使用docker-compose来build立一个使用mysql的nodejs应用程序
我试图containerize使用mysql数据库的nodejs应用程序。 nodejs应用程序和mysql数据库各自驻留在自己的容器中。 当我没有Docker直接运行它时,这个堆栈工作。
这是我的docker-compose
文件:
db: image: mysql:5.7 ports: - "3306:3306" expose: - "3306" environment: MYSQL_ROOT_PASSWORD: secret-root MYSQL_DATABASE: dbname MYSQL_USER: web MYSQL_PASSWORD: web app: build: . container_name: app volumes: - ".:/app" ports: - "3001:3000" links: - db environment: DB_HOST: db:3306 DB_USER: web DB_PASS: web DB_PORT: "3306"
节点应用程序的Dockerfile
:
FROM node:6.10 RUN mkdir /app WORKDIR /app COPY package.json /app/package.json RUN npm install RUN npm i -g db-migrate EXPOSE 3000 CMD tail -f /dev/null
通过执行docker-compose up
容器已经成功启动。
更新1
然后通过在应用程序容器中运行nodejs node_modules/nodemon/bin/nodemon -L ./bin/start.js
手动启动节点应用程序。
更新1结束
该应用程序现在正在监听端口3000.我可以使用外部mysql客户端连接到数据库。
但是,每当应用程序试图查询数据库,我收到以下错误:
/app/node_modules/mysql/lib/protocol/Parser.js:79 throw err; // Rethrow non-MySQL errors ^ TypeError: First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object. at fromObject (buffer.js:262:9) at Function.Buffer.from (buffer.js:101:10) at new Buffer (buffer.js:80:17) at Object.Auth.token (/app/node_modules/mysql/lib/protocol/Auth.js:29:22) at Handshake._sendCredentials (/app/node_modules/mysql/lib/protocol/sequences/Handshake.js:78:29) at Handshake.HandshakeInitializationPacket (/app/node_modules/mysql/lib/protocol/sequences/Handshake.js:60:10) at Protocol._parsePacket (/app/node_modules/mysql/lib/protocol/Protocol.js:280:23) at Parser.write (/app/node_modules/mysql/lib/protocol/Parser.js:75:12) at Protocol.write (/app/node_modules/mysql/lib/protocol/Protocol.js:39:16) at Socket.<anonymous> (/app/node_modules/mysql/lib/Connection.js:103:28) at emitOne (events.js:96:13) at Socket.emit (events.js:188:7) at readableAddChunk (_stream_readable.js:176:18) at Socket.Readable.push (_stream_readable.js:134:10) at TCP.onread (net.js:547:20)
我在这里错过了什么?