Docker 即使设置了 -L,Nodemon 也不会重新加载更改
Docker Nodemon not reloading on changes even though -L is set
您好,我正在尝试 docker调整我目前正在使用的应用程序。它使用 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 看不到任何变化并对它们做出反应的原因。
此外,在本地开发应用程序可能更直接,并且仅使用 docker 作为 package/ship 的手段。
如果你还想走这条路,我建议你这样。
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 ...
在您的 docker 文件中,您可以将命令替换为生产命令,因为在开发中,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 等。否则,它会被复制到图像中,这可能是不可取的。
另请注意,通过 您的依赖项已被锁定,并且不会自动更新。如果您的锁定文件与 package.json 不同步,它也会抛出错误。这就是您想要的生产。如果你在本地开发,你可以在本地 运行 npm install 或通过 docker exec 来增加依赖项,如果需要的话。然后你可以检查是否没有任何问题,并确保你的产品图像会很好,因为它再次从锁定文件中使用。
您好,我正在尝试 docker调整我目前正在使用的应用程序。它使用 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 看不到任何变化并对它们做出反应的原因。
此外,在本地开发应用程序可能更直接,并且仅使用 docker 作为 package/ship 的手段。
如果你还想走这条路,我建议你这样。
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 ...
在您的 docker 文件中,您可以将命令替换为生产命令,因为在开发中,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 等。否则,它会被复制到图像中,这可能是不可取的。
另请注意,通过