我是Docker的新手。我有一个项目设置如下:
app/
dist/
node_modules/
package.json
Dockerfile
docker-compose.yml
.dockerignore
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
version: '2'
services:
web:
build: .
command: gulp
ports:
- "3000:3000"
volumes:
- .:/app
package:
build: .
command: ./package.sh
volumes:
- ./package:/app/package
# 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。
答案 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
,也许您应该考虑删除该卷,而应将COPY
或ADD
的目录放在Dockerfile
中。
答案 1 :(得分:0)
node_modules将在您安装NPM模块时生成。您要安装的唯一模块是gulp,但具有全局选项-g,因此该模块将不会安装在当前目录中。
尝试在本地安装模块,例如通过向您的Dockerfile添加此行
RUN npm install fs
,您将看到已创建node_modules文件夹。
答案 2 :(得分:0)
您将项目根目录挂载到容器中“ / app”路径中,其中卷在撰写文件中。因此,启动容器时,本地的node_modules会在容器的卷路径(容器的node_modules文件夹)中替换自身。您必须将docker_compose.yml文件中的node_modules与卷隔离。我想您在项目文件夹中有一个gulpfile.js。我为您添加。
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
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的更多信息。