Node.js+TypeScript项目Docker构建时.env.example文件未复制至镜像及docker-compose启动报错求助
问题分析与解决方案
看起来你的核心问题是代码在容器的工作目录(/usr/app)下寻找.env.example,但你只把它复制到了dist目录,最终容器的根工作目录下并没有这个文件,另外还有一些配置细节需要调整,我们一步步来解决:
1. 修正Dockerfile,确保.env.example出现在正确位置
你的Dockerfile里在builder阶段把.env.example复制到了./dist,但代码是在当前工作目录(/usr/app)读取这个文件,所以这一步完全没必要。反而应该在最终的运行阶段(stage2)把.env.example从builder镜像复制到容器的工作目录下。
修改后的Dockerfile如下:
# stage 1 building the code FROM node as builder WORKDIR /usr/app COPY package*.json ./ RUN npm install COPY . . COPY .env.production .env RUN npm run build # stage 2 FROM node WORKDIR /usr/app COPY package*.json ./ RUN npm install --production COPY --from=builder /usr/app/dist ./dist # 新增:从builder镜像复制.env.example到当前工作目录 COPY --from=builder /usr/app/.env.example ./ COPY ormconfig.docker.json ./ormconfig.json EXPOSE 4000 CMD node dist/index.js
2. 移除docker-compose中不必要的volume挂载
你的docker-compose.yaml里挂载了./src:/src,但:
- 你运行的是编译后的
dist/index.js,本地的src代码不会被容器使用 - 这个挂载路径和容器内的工作目录(
/usr/app)不匹配,完全是多余的,甚至可能引发路径混淆问题
修改后的docker-compose.yaml:
version: "3.7" services: db: image: postgres environment: POSTGRES_PASSWORD: postgres POSTGRES_USER: postgres POSTGRES_DB: postgres volumes: - ./pgdata:/var/lib/postgresql/data ports: - "5432:5432" web: build: context: ./ dockerfile: ./Dockerfile depends_on: - db ports: - "4000:4000" # 移除多余的src挂载
3. 额外检查:确保.env.example没有被忽略
确认你的.gitignore(如果有的话)里没有包含.env.example,否则COPY . .在builder阶段不会把这个文件复制到镜像中。如果.gitignore里有这一行,把它删掉或者改成!.env.example来排除这个规则。
验证步骤
- 清理之前的镜像和容器:
docker-compose down -v --rmi local - 重新构建并启动:
docker-compose up --build - 进入web容器验证文件是否存在:
docker exec -it <your-web-container-name> ls /usr/app,应该能看到.env.example文件
这样应该就能解决你遇到的“no such file or directory, open '.env.example'”错误了。
内容的提问来源于stack exchange,提问作者maxfromgermany
相关产品推荐
相关产品推荐

