解决 Docker 的一些菜鸟问题...我正在尝试将 Node.js 程序作为 Docker 中的容器启动。该程序正在尝试连接到已在另一个容器中运行的现有 MySql 数据库。容器名称为“mysql”,程序名称为“app”。
当前在 Docker 中运行的 MySql 工作正常,phpMyAdmin 正在与它一起运行,一切正常。它在 Docker 桌面中正确显示为“mysql”,我可以查询它,从 bash shell 连接到它,一切都很好。
但是 - 该应用程序将无法运行,显然是因为它找不到 mysql。我以为 NPM 应该自动管理我的依赖项?
这是应用程序代码
var http = require('http');
var url = require('url');
var mysql = require('mysql');
var dt = require('./mytestmodule');
这是 Dockerfile
FROM node
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY package.json .
COPY package-lock.json .
RUN npm install
COPY . .
EXPOSE 8080
CMD [ "node", "app.js" ]
这是 Docker 的输出
docker run --name mysecond --link mysql:db -p 8080:80 mysecond
node:internal/modules/cjs/loader:1051
throw err;
^
Error: Cannot find module 'mysql'
Require stack:
- /usr/src/app.js
(... other stuff ...)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:83:12) {
code: 'MODULE_NOT_FOUND',
requireStack: [ '/usr/src/app.js' ]
}
看起来没有找到mysql模块,是吗?
我确实使用 NPM 安装了 mysql,就像我说的那样,它在 Docker 容器中运行良好,而 phpMyAdmin 在另一个容器中运行。在该配置中,我在启动 phpMyAdmin 时链接到数据库,如下所示:
docker run --name mysql -d -e MYSQL_ALLOW_EMPTY_PASSWORD=TRUE --expose 3306 --mount type=bind,source=/e/databases,target=/var/lib/mysql mysql
docker run --name myadmin -d -e PMA_ARBITRARY=1 --link mysql:db -p 8081:80 phpmyadmin
这让我可以通过端口 8081 访问 phpMyAdmin。
我的期望是这应该与我的 app.js 相同,所以我这样做了:
docker run --name app --link mysql:db -p 8080:80 app
我预计该应用程序会出现在 localhost:8080 上,但它永远不会走到那么远。
发生了什么事,为什么找不到mysql?
您的
Dockerfile
公开了端口 8080,但是当您运行容器时,您使用 -p 8080:80
而不是 -p 8080:8080
。
请注意,运行多个相关容器的一个好选择是创建一个
compose.yaml
,按照本教程中的说明对它们进行分组。