创建Docker自己的node_modules

时间:2019-08-15 15:53:54

标签: docker devops

我是Docker的新手。我有一个项目设置如下:

app/
dist/
node_modules/       
package.json
Dockerfile           
docker-compose.yml  
.dockerignore        

Dockerfile

FROM node:10.16.2

WORKDIR /app

RUN sed -i '/jessie-updates/d' /etc/apt/sources.list

RUN apt-get update
RUN rm -rf /var/lib/apt/lists/*
RUN npm install --quiet
RUN npm install -g gulp

EXPOSE 3000

docker-compose.yml

version: '2'

services:
  web:
    build: .
    command: gulp
    ports:
      - "3000:3000"
    volumes:
      - .:/app
  package:
    build: .
    command: ./package.sh
    volumes:
      - ./package:/app/package

.dockerignore

# add git-ignore syntax here of things you don't want copied into docker image

.git
*Dockerfile*
*docker-compose*
package-lock.json
node_modules/

当我运行docker-compose build --no-cache web && docker-compose up web时,实际上不是创建它自己的node_modules,而是使用本地系统。运行docker时,我需要docker自己的node_modules。请帮忙。

我确实知道,我正在将所有文件从本地复制到docker安装程序,但我想排除node_modules,并使其安装自己的node_modules。

4 个答案:

答案 0 :(得分:0)

问题在于您在docker-compose.yml中安装了卷。但是,this question也解决了相同的问题。

您可以通过以下操作手动覆盖卷中的node_modules

volumes:
    - '.:/app'
    - /app/node_modules/

这样,node_modules应该为空。

编辑:

这种方法似乎不再起作用。而是在您的计算机上创建一个空文件夹,例如empty.d并安装以下目录:

volumes:
    - '.:/app'
    - 'empty.d/:/app/node_modules/'

但是,由于您的容器名称为build,也许您应该考虑删除该卷,而应将COPYADD的目录放在Dockerfile中。

答案 1 :(得分:0)

node_modules将在您安装NPM模块时生成。您要安装的唯一模块是gulp,但具有全局选项-g,因此该模块将不会安装在当前目录中。

尝试在本地安装模块,例如通过向您的Dockerfile添加此行

RUN npm install fs

,您将看到已创建node_modules文件夹。

答案 2 :(得分:0)

您将项目根目录挂载到容器中“ / app”路径中,其中卷在撰写文件中。因此,启动容器时,本地的node_modules会在容器的卷路径(容器的nod​​e_modules文件夹)中替换自身。您必须将docker_compose.yml文件中的node_modules与卷隔离。我想您在项目文件夹中有一个gulpfile.js。我为您添加。

Dockerfile

FROM node:10.16.2

WORKDIR /home

RUN sed -i '/jessie-updates/d' /etc/apt/sources.list

RUN apt-get update
RUN rm -rf /var/lib/apt/lists/*
RUN npm install --quiet
RUN npm install -g gulp

EXPOSE 3000

docker-compose.yml

version: '2'

services:
  web:
    build: .
    command: gulp
    ports:
      - "3000:3000"
    volumes:
      - ./app:/home/app
      - ./dist:/home/dist
      - ./package.json:/home/package.json
      - ./gulpfile.js:/home/gulpfile.js
  package:
    build: .
    command: ./package.sh
    volumes:
      - ./package:/home/package

使用此配置,在安装新的节点程序包时,必须为每个服务安装它。您可以通过“ docker exec [container_id] npm install”来做到这一点。

我希望您会对这篇文章满意:)

答案 3 :(得分:0)

您正在将主机卷(即您的项目文件夹)装入容器中

volumes:
      - .:/app

因此,当您执行类似WORKDIR /app的操作时,您会将Dockerfile所在的工作目录映射到容器中的/ app,因此您实际上位于主机上的项目文件夹中,而不是副本中。您再次在主机上运行npm install。如果您在该文件夹(应用程序)中进行了任何修改,更改将直接写入主机。

.dockerignore在这里无效。构建映像时,Docker将复制映像内部Dockerfile存在的工作目录(构建上下文)的内容。这是一个自动过程,您无需您自己。这就是为什么要使用.dockerignore的原因,以便可以排除在构建过程中无法复制文件和目录。

当主机上有要在容器中提供的数据时,就挂载卷(读/写访问权限-它是可配置的,附加:ro将使其变为只读)。请注意,在运行时将卷应用于容器。 .dockerignore仅在构建图像时使用。有关volumes的更多信息。