我正在尝试将一个简单的Node.js应用程序Docker化,以进行开发目的。
为此,我创建了一个简单的Dockerfile:
FROM node:15-alpine
# Code folder inside Docker
RUN mkdir /code
WORKDIR /code
# Install deps before mounting volume to improve caching
COPY package*.json ./
RUN npm install
# No need to copy code, we are building a volume later
EXPOSE 1234
除了两个非常相似的docker-compose.yml文件外,一个用于测试,另一个用于以dev模式运行应用程序。
version: "3.1"
services:
db:
image: mongo:4
environment:
MONGO_INITDB_ROOT_USERNAME: my-user
MONGO_INITDB_ROOT_PASSWORD: my-pswd
MONGO_INITDB_DATABASE: my-db
app:
environment:
- NODE_ENV=development
depends_on:
- "db"
build: .
ports:
- "1234:1234"
env_file: ./.docker.env
command: npm run dev
volumes:
- .:/code
- /code/node_modules
问题在于每当我启动
docker-compose up
、npm run dev
(它只是指向nodemon index.js
)时,失败了,因为没有安装nodemon
包。每当我启动
docker-compose run app
时,它都可以正常运行。以及docker-compose run app sh
也可以让我顺利地启动npm run dev
。
docker-compose.yml
和docker-compose.test.yml
都有NODE_ENV=development
,测试文件还从node_modules中启动一个命令(mocha
确切说)。请注意,这种行为是在我从
node:15
迁移到node:15-alpine
后出现的。如果有人知道原因,我将非常感激。
volumes:
指示 Docker 在第一次运行时保留node_modules
树,并优先使用该保留卷,而不是镜像中的内容:所有对package.json
的更新都将被完全忽略。如果你只是想针对本地源树运行 Node,那么在本地安装可能会更容易些。 - David Maze