首页 > 解决方案 > workdir 中没有这样的文件或目录

问题描述

我正在尝试用 Docker 包装我的 node express 后端。但是,在运行我的 docker-compose 文件时。npm install我在整个 dockerfile 中运行 stage 时遇到错误,说它没有找到将我本地目录中的 package.json 复制到我的容器内的目录。下面是我的项目目录结构。尝试使用 nginx 代理我的 node express 后端 API。任何可以帮助我努力实现的资源都非常感谢。

错误日志:

> [4/5] RUN npm install:
#8 0.697 npm ERR! code ENOENT
#8 0.697 npm ERR! syscall open
#8 0.697 npm ERR! path /app/package.json
#8 0.698 npm ERR! errno -2
#8 0.699 npm ERR! enoent ENOENT: no such file or directory, open '/app/package.json'

项目目录:

express-backend
 ├── docker
 |   ├── nginx
 |   |   ├── nginx.conf
 |   |   └── dockerfile
 |   └── dockerfile
 ├── src
 |   ├── model
 |   |   └── model.ts
 |   ├── controller
 |   |   └── controller.ts
 |   ├── middleware
 |   |   └── middleware.ts
 |   └── server.ts
 | .dockerignore
 | .gitignore
 | docker-compose.yml
 | package-lock.json
 | package.json
 | tsconfig.json

码头工人/码头工人文件:

FROM node:alpine

WORKDIR /app

COPY package*.json ./

RUN npm install

COPY . ./

EXPOSE 5000

RUN npm run build

CMD ["node", "/app/build/server.js", "npm run start"]

码头工人/nginx/码头工人文件

FROM nginx
COPY nginx.conf /etc/nginx/conf.d/default.conf

码头工人/nginx/nginx.conf

server {
        listen 80 default_server;
        listen [::]:80 default_server;
        server_name nodeserver;

        location / {
           proxy_http_version 1.1;
           proxy_cache_bypass $http_upgrade;
           proxy_set_header Upgrade $http_upgrade;
           proxy_set_header Connection 'upgrade';
           proxy_set_header Host $host;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_set_header X-Forwarded-Proto $scheme;
           proxy_pass http://localhost:5000;
        }
}

码头工人-compose.yml

version: "3.8"
services:
  express:
    container_name: express_container
    build:
      context: ./docker
    environment:
    ports:
      - "5000:5000"
  nginx: 
    container_name: nginx_container
    restart: always
    build:
      context: ./docker/nginx
    ports:
      - "80:80"
  postgres:
    container_name: postgres_container
    image: postgres
    restart: always
    environment:
    ports:
      - "5432:5432"
  pgadmin:
    container_name: pgadmin_container
    image: dpage/pgadmin4
    restart: always
    environment:
    ports:
      - "5050:80"

标签: dockerdocker-composedockerfile

解决方案


您已经设置了上下文:

context: ./docker

所以当你跑

COPY . ./

您正在从该上下文复制文件,其中不包括package.json. 您可以指定 Dockerfile:

  express:
    container_name: express_container
    build:
      dockerfile: ./docker/Dockerfile
    environment:
    ports:
      - "5000:5000"

但我建议重组文件夹以在有意义的情况下将每个图像分开。


推荐阅读