我试图对我的 nodejs-mysql 应用程序进行 dockerize。我有两个容器 Nodejs 和 Mysql。 Mysql 容器有一个到 3306 的开放端口。
这是我的 Dockerfile:
FROM 节点:最新
工作目录 /app
复制包*.json ./
运行 npm install -g nodemon
运行 npm install
复制。 .
这是我的 docker-compose.yml 文件:
version: "3.8"
services:
express-server:
build:
context: .
environment:
MYSQL_HOST: mysql-service
MYSQL_USER: 'root'
MYSQL_ROOT_PASSWORD: 'root'
MYSQL_DATABASE: 'warehouse'
entrypoint: ["npm", "start"]
ports:
- "8080:8000"
volumes:
- .:/app
- /app/node_modules
depends_on:
- mysql-service
mysql-service:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: 'root'
MYSQL_DATABASE: 'warehouse'
ports:
- "3306:3306"
volumes:
- mysql-db-data:/var/lib/mysql
- mysql-db-config-data:/etc/mysql
volumes:
mysql-db-data:
mysql-db-config-data:
出现的错误:
Building express-server
Sending build context to Docker daemon 6.009MB
Step 1/6 : FROM node:latest
---> 7105279fa2ab
Step 2/6 : WORKDIR /app
---> Using cache
---> ca2eb57497d7
Step 3/6 : COPY package*.json ./
---> Using cache
---> b9a292d28bde
Step 4/6 : RUN npm install -g nodemon
---> Using cache
---> 3d6a9cac2364
Step 5/6 : RUN npm install
---> Using cache
---> 4a91bb3f0306
Step 6/6 : COPY . .
---> 296ff4a8ff49
Successfully built 296ff4a8ff49
Successfully tagged nodejs-mysql-docker-compose_express-server:latest
Recreating nodejs-mysql-docker-compose_mysql-service_1 ... done
Recreating nodejs-mysql-docker-compose_express-server_1 ... done
Attaching to nodejs-mysql-docker-compose_mysql-service_1, nodejs-mysql-docker-compose_express-server_1
mysql-service_1 | 2021-06-26 10:15:51+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.25-1debian10 started.
mysql-service_1 | 2021-06-26 10:15:52+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
mysql-service_1 | 2021-06-26 10:15:52+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.25-1debian10 started.
mysql-service_1 | 2021-06-26T10:15:53.360045Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.25) starting as process 1
mysql-service_1 | 2021-06-26T10:15:53.423308Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
mysql-service_1 | 2021-06-26T10:15:54.886687Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
express-server_1 |
express-server_1 | > nodejs-mysql-docker-compose@1.0.0 start
express-server_1 | > nodemon app.js
express-server_1 |
express-server_1 | [nodemon] 2.0.7
express-server_1 | [nodemon] to restart at any time, enter `rs`
express-server_1 | [nodemon] watching path(s): *.*
express-server_1 | [nodemon] watching extensions: js,mjs,json
express-server_1 | [nodemon] starting `node app.js`
mysql-service_1 | 2021-06-26T10:15:55.196958Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock
express-server_1 | Server is running at: 8000
mysql-service_1 | 2021-06-26T10:15:55.760561Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
mysql-service_1 | 2021-06-26T10:15:55.762472Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
express-server_1 | /app/mysql-connect.js:14
express-server_1 | throw err
express-server_1 | ^
express-server_1 |
express-server_1 | Error: connect ECONNREFUSED 172.19.0.2:3306
express-server_1 | at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1133:16)
express-server_1 | --------------------
express-server_1 | at Protocol._enqueue (/app/node_modules/mysql/lib/protocol/Protocol.js:144:48)
express-server_1 | at Protocol.handshake (/app/node_modules/mysql/lib/protocol/Protocol.js:51:23)
express-server_1 | at Connection.connect (/app/node_modules/mysql/lib/Connection.js:116:18)
express-server_1 | at Object.<anonymous> (/app/mysql-connect.js:12:12)
express-server_1 | at Module._compile (node:internal/modules/cjs/loader:1109:14)
express-server_1 | at Object.Module._extensions..js (node:internal/modules/cjs/loader:1138:10)
express-server_1 | at Module.load (node:internal/modules/cjs/loader:989:32)
express-server_1 | at Function.Module._load (node:internal/modules/cjs/loader:829:14)
express-server_1 | at Module.require (node:internal/modules/cjs/loader:1013:19)
express-server_1 | at require (node:internal/modules/cjs/helpers:93:18) {
express-server_1 | errno: -111,
express-server_1 | code: 'ECONNREFUSED',
express-server_1 | syscall: 'connect',
express-server_1 | address: '172.19.0.2',
express-server_1 | port: 3306,
express-server_1 | fatal: true
express-server_1 | }
express-server_1 | [nodemon] app crashed - waiting for file changes before starting...
mysql-service_1 | 2021-06-26T10:15:55.808173Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
mysql-service_1 | 2021-06-26T10:15:55.992990Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.25' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL.
如何解决这个错误?有什么我遗漏的吗?