gpt4 book ai didi

mysql - 当我尝试使用 docker-compose 为 Nodejs 和 mysql 应用程序运行 docker 容器时,出现端口使用错误

转载 作者:行者123 更新时间:2023-11-29 09:31:57 25 4
gpt4 key购买 nike

如何使用 docker-compose创建容器并在启动期间将参数传递给我的 Node.js 应用程序?

我正在尝试编写一个程序,可以使用 NODEJS 和 DOCKER-COMPOSE 连接 MYSQL。我需要在终端中运行应用程序,以便在启动期间将一些参数传递给 Node.js 应用程序,因此我需要运行 DOCKER-COMPOSE UP 来启动应用程序和 MYSQL,然后我想使用以下命令运行应用程序另一个窗口中的 CLI。

这是我的index.js文件存在于web内当我使用以下命令 nodemon start New 运行时,该文件夹将获取用户的输入.

     //Make NodeJS to Listen to a particular Port in Localhost
const port = 9010;
app.listen(port, function(){
// Start the server and read the parameter passed by User
console.log("Node js is Running on : "+port);
// Get process.stdin as the standard input object.
var standard_input = process.stdin;

// Set input character encoding.
standard_input.setEncoding('utf-8');

// Prompt user to input data in console.
console.log("Please input text in command line.");

// When user input data and click enter key.
standard_input.on('data', function (data) {
console.log(" DATA ENTERED BY USER IS :"+data);
});
});

我想使用docker-compose来实现这一点因此我有 docker-compose.yml 的以下代码文件。

version: '3'

services:
db:
build: ./db
environment:
MYSQL_DATABASE: mydb
MYSQL_ROOT_PASSWORD: mypass
MYSQL_USER: mysql
MYSQL_PASSWORD: mypass
DATABASE_HOST: myhost
web:
build: ./web
depends_on:
- db
restart: on-failure
ports:
- "9010:9010"

adminer:
image: adminer
restart: always
ports:
- "7778:8080"

我的Dockerfile用于 web 内的 Web 或 Node.js文件夹是:

FROM node:8

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 9010

CMD ["npm","start"]

我的Dockerfile对于数据库MYSQL db内文件夹是:

FROM mysql:5.7

EXPOSE 3306

COPY ./scripts /docker-entrypoint-initdb.d/

现在,当我运行命令 docker-compose up --build 时对于docker-compose.yml文件然后一切正常;容器和 Node.js 应用程序启动。

当我打开另一个终端窗口并尝试导航到 web 时容器使用docker-compose exec web sh并启动 Node 应用传递参数nodemon start New然后我收到以下错误。

events.js:183
throw er; // Unhandled 'error' event
^

Error: listen EADDRINUSE :::9010
at Server.setupListenHandle [as _listen2] (net.js:1360:14)

由于当我运行命令 docker-compose up --build 时 Nodejs 应用程序已经在运行端口已分配,因此我收到此错误,如何启动 Indey.js 应用程序并向其传递参数?

我正在使用 Ubuntu 操作系统来运行该应用程序。

最佳答案

原因是已经有正在运行的nodejs应用程序从CMD运行并占用了端口,因此当在docker内运行命令时,您会收到EDDRINUSE错误。

您将有多种选择,

  • 不要从 docker 的 CMD 启动 Node 应用程序,但当 Nodejs 进程在容器内运行时,您不会注意到。但这可以是处理的选项,因此更改 Node Dockerfile 中的 CMD
CMD ["npm","start"]
#change the above cmd to
CMD tail -f /dev/null

这只会让你的nodejs容器保持运行,然后在容器内运行命令。

docker-compose exec web sh
nodemon start New
  • 更改手动运行的脚本的端口,这样就不会发生冲突,因为脚本将在不同的端口上启动,

稍微更新一下nodejs代码

//Make NodeJS to Listen to a particular Port in Localhost
const port = process.env.PORT;

现在使用不同的端口启动该过程

PORT=9011 nodemon start New

关于mysql - 当我尝试使用 docker-compose 为 Nodejs 和 mysql 应用程序运行 docker 容器时,出现端口使用错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58526677/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com