如何避免node_modules文件夹被删除

问题描述

我正在尝试创建一个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放入测试目录。 要解决此问题,您可以使用两个选项。

  1. 您可以在单独的目录(如/ node)中运行npm install,并将代码安装在测试目录中,并像export NODE_PATH=/node/node_modules那样导出node_path env 那么Doc​​kerfile会像这样:
FROM node:14.4.0-alpine
WORKDIR /node
COPY package*.json ./
RUN npm install .
WORKDIR /test
CMD [ "npm","test" ]

  1. 或者您可以编写一个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上运行该应用。

文件夹结构

enter image description here

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