【发布时间】:2020-04-08 12:43:56
【问题描述】:
我已经在 stackoverflow 上搜索了所有与此相关的答案,但似乎没有一个能解决我的问题。我正在按照此链接对我的 nodejs-mysql 应用程序进行 dockerize:
https://github.com/varunon9/getting-started-docker-mysql-nodejs#launching-nodejs-app-in-a-container
当我来到第 8 步并执行 docker ps 时,容器未显示。我检查了日志,它显示“错误:找不到模块'express'”。我的运行命令是:
docker run -t -d \
--publish 7000:7000 \
--link testmysqlservice:db \
--name=test-nodejs-microservice patient-nodejs
After step-8 the sql service seems to get stuck or running not sure:
package.json 文件
{
"name": "paloit",
"version": "1.0.0",
"description": "",
"main": "server.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "node server.js"
},
"author": "",
"license": "ISC",
"dependencies": {
"arraylist": "^0.1.0",
"avl": "^1.4.4",
"body-parser": "^1.19.0",
"cheerio": "^1.0.0-rc.3",
"ejs": "^3.0.1",
"express": "^4.17.1",
"hashmap": "^2.4.0",
"hashtable": "git+https://github.com/fabrice102/node-hashtable.git",
"jquery": "^3.4.1",
"jsdom": "^15.2.1",
"morgan": "^1.9.1",
"multimap": "^1.1.0",
"mysql": "^2.17.1",
"request": "^2.88.0",
"sort-map": "^1.0.0",
"sorted-map": "^0.1.8",
"yargs": "^15.0.2"
}
}
Mysql 的 Docker 文件
拉取mysql:5.7镜像
FROM mysql:5.7
## The maintainer name and email
LABEL gaga maga <gagad@gmail.com>
# database = test and password for root = password
ENV MYSQL_DATABASE=patientdb \
MYSQL_ROOT_PASSWORD=password
# when container will be started, we'll have `test` database created with this schema
COPY ./patientschem_patient.sql /docker-entrypoint-initdb.d/
Nodejs 的 Dockerfile
# Use Node v8 as the base image.
FROM node:8
# create and set app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package.json /usr/src/app/
RUN npm install
# Bundle app source
COPY . /usr/src/app
EXPOSE 7000
# Run app
CMD ["npm", "start"]
server.js 文件的一部分
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
const mysql = require('mysql');
const request = require('request');
const argv = require('yargs').argv;
app.use(express.static('public'));
app.use(bodyParser.urlencoded({ extended: true }));
app.set('view engine', 'ejs')
app.get('/', function(req, res) {
........
request(url, function(error, response, body, next) {
var illness = JSON.parse(body)
var ill = illness._embedded.illnesses
//var link = _links.self
res.render(....);
});
});
function getConnection(){
return mysql.createConnection(
{
host: 'localhost',
user: 'root',
password: 'password',
database: 'patientschem'
}
)
}
app.post('/displayhospital', (req, res) => {
console.log("trying to get form data");
.......
const queryString = "INSERT INTO patient (e, d, p) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE d = VALUES(dl), p = VALUES(pl)"
});
const server = app.listen(7000, () => {
console.log(`Express running → PORT ${server.address().port}`);
});
我有两个 ejs 文件 - 索引和结果
【问题讨论】:
-
运行构建后容器对您可见吗?运行以下命令:docker images
-
使用以下命令 docker run -it
sh 从上面的 docker images 命令输出中获取图像 ID -
我尝试自己构建和运行 docker 映像并且能够成功运行......现在让我们调试你的实现......运行了以下命令:``` docker build -t test-nodejs 。 docker images docker run -t -d --publish 7000:7000 test-nodejs ```
-
从错误日志来看,运行 nodejs 的依赖项似乎没有正确安装。值得查看
docker build日志。 -
您将面临的另一个问题是 db connection url 。
localhost将在运行时引用节点应用程序容器,这是错误的。搜索 docker network 以及如何在上面添加容器。