.dockerignore在docker-compose子目录构建时失效问题排查
问题:.dockerignore配置忽略index.js后,容器内仍存在该文件
项目目录结构
market/ |--.dockerignore |--Dockerfile |--index.js |--package.json |--package-lock.json |--market docker-compose.yml
相关配置文件内容
docker-compose.yml
version: "3.8" services: market: build: context: ./ dockerfile: ./market/Dockerfile
Dockerfile
FROM node:20 WORKDIR /usr/src/app COPY /market/package*.json ./ RUN npm install COPY /market/. ./ CMD ["ls"]
.dockerignore
index.js
容器执行结果
启动容器后执行ls命令,输出如下:
dockertest-market-1 | Dockerfile dockertest-market-1 | index.js dockertest-market-1 | node_modules dockertest-market-1 | package-lock.json dockertest-market-1 | package.json
问题原因
核心问题是.dockerignore的位置不对:
- 你在
docker-compose.yml里指定的构建上下文是项目根目录./(也就是包含market/文件夹和docker-compose.yml的那个目录)。 - Docker在构建时只会读取构建上下文根目录下的
.dockerignore文件,不会自动去子目录里查找。你把.dockerignore放在market/文件夹里,等于这个规则根本没被Docker读取到,自然不会生效。
解决办法
有两种简单的修复方式:
- 移动.dockerignore位置:把
market/里的.dockerignore文件移到项目根目录(和docker-compose.yml同目录),内容保持不变。这样Docker构建时就能识别到忽略规则,不会把market/index.js复制进容器。 - 调整构建上下文:修改
docker-compose.yml的构建上下文为./market,同时简化Dockerfile里的路径:- 修改后的docker-compose.yml:
version: "3.8" services: market: build: context: ./market dockerfile: Dockerfile - 修改后的Dockerfile:
FROM node:20 WORKDIR /usr/src/app COPY package*.json ./ RUN npm install COPY . ./ CMD ["ls"]
market/目录,里面的.dockerignore就能正常生效,index.js会被忽略。 - 修改后的docker-compose.yml:
内容的提问来源于stack exchange,提问作者TungTung
相关产品推荐
相关产品推荐

