【问题标题】:no such file or directory in workdirworkdir 中没有这样的文件或目录
【发布时间】:2021-10-31 20:31:35
【问题描述】:

我正在尝试用 Docker 包装我的 node express 后端。但是,在运行我的 docker-compose 文件时。我在整个 dockerfile 中运行 npm install 阶段时遇到错误,说它没有找到在我的本地目录中复制的 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"]

docker/nginx/dockerfile

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

docker/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;
        }
}

docker-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"

【问题讨论】:

    标签: docker docker-compose dockerfile


    【解决方案1】:

    你已经设置了上下文:

    context: ./docker
    

    所以当你运行时

    COPY . ./
    

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

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

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

    【讨论】:

    • 如果我仍然将 docker compose 上下文保持为它正在使用的内容 ./docker 所以如果我正确处理这个问题,在我的 dockerfile 中我应该将目录更改为一级,如 ../package.json ./../ ./对吗?
    • 所以我将 express 后端的 dockerfile 移到了我的根目录,并将上下文更改为 ./ 它安装依赖项没有问题。我只是想知道为什么在 dockerfile 中更改一级目录不起作用。
    • 感谢您对重组文件夹以分别保存每个图像的建议。我明白为什么现在处理你所说的。谢谢大佬。
    • 您不能复制不在上下文中的文件。来自 .. 的副本将超出上下文。
    猜你喜欢
    • 2021-06-24
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 2011-03-25
    • 1970-01-01
    相关资源
    最近更新 更多