嗨,我正在尝试对我当前正在使用的应用程序进行 dockerize。它使用nodejs和mariadb。我在弄清楚如何使 nodemon 工作时遇到一些困难。
我尝试使用 --legacy-watch 或 -L 这是缩写形式,但它没有改变结果。
NPM 安装了所有依赖项,我什至得到了 nodemon 文本,但当我进行更改时它不会重新启动服务器。
如果有人能帮忙就太好了
package.json:
{
"name": "nodejs_mariadb_docker_test",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "node src/index.js",
"dev": "nodemon -L src/index.js"
},
"author": "",
"license": "ISC",
"dependencies": {
"express": "^4.17.2",
"mariadb": "^2.5.5",
"nodemon": "^2.0.15"
}
}
Nodejs 的 Dockerfile:
# Specifies the image of your engine
FROM node:16.13.2
# The working directory inside your container
WORKDIR /app
# Get the package.json first to install dependencies
COPY package.json /app
# This will install those dependencies
RUN npm install
# Copy the rest of the app to the working directory
COPY . /app
# Run the container
CMD ["npm", "run", "dev"]
和 docker 撰写文件:
version: "3"
services:
node:
build: .
container_name: express-api
ports:
- "80:8000"
depends_on:
- mysql
mysql:
image: mariadb:latest
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: "password"
volumes:
- mysqldata:/var/lib/mysql
- ./mysql-dump:/docker-entrypoint-initdb.d
volumes:
mysqldata: {}
最佳答案
所以明显的问题是你没有将代码挂载到容器中。这就是为什么 nodemon 无法看到任何更改并对它们使用react。
此外,在本地开发应用程序可能更直接,并且仅使用 docker 作为打包/发布它的方式。
如果你仍然想走这条路,我建议你这样做。
services:
express-api:
build: ./
# overwrite the prod command
command: npm run dev
ports:
- "80:8000"
volumes:
# mount your code folder into the app folder
- .:/app
# mysql stuff ...
在您的 dockerfile 中,您可以将命令替换为生产命令,因为在开发中,compose 将覆盖它。
FROM node:16.13.2
WORKDIR /app
COPY package.json package-lock.json ./
# use ci to install from the lock file,
# to avoid suprises in prod
RUN npm ci
COPY . ./
# use the prod command
CMD ["npm", "run", "start"]
这会在开发中做一些多余的工作,比如复制代码,但应该没问题。
此外,您可能希望使用 .dockerignore
来忽略 mysqldump。否则,它将被复制到图像中,这可能是不可取的。
另请注意,通过 npm ci您的依赖项已锁定,并且不会自动更新。如果您的锁定文件与 package.json 不同步,它也会引发错误。这就是您想要的生产效果。如果您在本地开发,则可以在本地运行 npm install 或通过 docker exec 来增加依赖项(如果需要)。然后您可以检查是否没有任何损坏,并确保您的产品镜像不会出现问题,因为它再次从锁定文件中使用。
关于node.js - 即使设置了 -L,Docker Nodemon 也不会在更改时重新加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70958923/