问题描述
我正在尝试创建一个Docker容器来充当我的应用程序的测试环境。我正在使用以下Dockerfile:
FROM node:14.4.0-alpine
workdir /test
copY package*.json ./
RUN npm install .
CMD [ "npm","test" ]
如您所见,这非常简单。我只想安装所有依赖项,但不复制代码,因为我将使用以下命令运行该容器:
docker run -v `pwd`:/test -t <image-name>
但是问题是,当我使用node_modules
装载卷时,-v
目录被删除了。有解决此问题的解决方法吗?
解决方法
当您将装载测试目录与$ PWD绑定时,您的容器测试目录将被$ PWD覆盖/装载。因此,您将不再将node_modules放入测试目录。 要解决此问题,您可以使用两个选项。
- 您可以在单独的目录(如/ node)中运行
npm install
,并将代码安装在测试目录中,并像export NODE_PATH=/node/node_modules
那样导出node_path env 那么Dockerfile会像这样:
FROM node:14.4.0-alpine
WORKDIR /node
COPY package*.json ./
RUN npm install .
WORKDIR /test
CMD [ "npm","test" ]
- 或者您可以编写一个entrypoint.sh脚本,该脚本将在容器运行时将node_modules文件夹复制到测试目录。
FROM node:14.4.0-alpine
WORKDIR /node
COPY package*.json ./
RUN npm install .
WORKDIR /test
COPY Entrypoint.sh ./
ENTRYPOINT ["Entrypoint.sh"]
和Entrypoint.sh类似
#!/bin/bash
cp -r /node/node_modules /test/.
npm test
,
方法1
一种解决方法是可以做到的
CMD npm install && npm run dev
方法2
让docker在node_modules
上安装docker-compose
并在docker-compose up
上运行该应用。
文件夹结构
docker-compose.yml
version: '3.5'
services:
api:
container_name: /$CONTAINER_FOLDER
build: ./$LOCAL_FOLDER
hostname: api
volumes:
# map local to remote folder,exclude node_modules
- ./$LOCAL_FOLDER:/$CONTAINER_FOLDER
- /$CONTAINER_FOLDER/node_modules
expose:
- 88
Dockerfile
FROM node:14.4.0-alpine
WORKDIR /test
COPY ./package.json .
RUN npm install
# run command
CMD npm run dev