Docker Compose 在“/app”中找不到 package.json 文件

问题描述 投票:0回答:5

这是我的项目结构

.
├── README.md
├── docker-compose.yml
└── frontend
    ├── Dockerfile
    ├── README.md
    ├── build
    ├── package.json
    ├── yarn.lock
    └── ...

Docker-compose.yml

version: '3.7'

services:
  frontend:
    build:
      context: frontend
      dockerfile: Dockerfile
    volumes:
      - '.:/app'
      - '/app/node_modules'
    ports:
      - 3000:3000

Dockerfile

FROM node:14-alpine

WORKDIR /app

COPY ./package.json /app/package.json
RUN yarn install --no-lockfile

COPY . .

CMD ["yarn", "start"]

如果我使用 docker 构建容器,它工作正常

但是

docker-compose up --build
总是会回来

Attaching to book-marketplace_frontend_1
frontend_1  | yarn run v1.22.15
frontend_1  | error Couldn't find a package.json file in "/app"
frontend_1  | info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
book-marketplace_frontend_1 exited with code 1

奇怪的是,docker-compose 仍然可以运行yarn install(需要package.json),但稍后找不到它。希望有人能帮助我

docker docker-compose
5个回答
4
投票

因为您已经在workdir

app
中,正如您之前定义的
WORKDIR
一样。因此将行更改为:

COPY ./package.json /package.json 


2
投票

您的

volumes:
块正在用完全不同的内容替换容器中的
/app
目录。 (您使用
frontend
子目录作为构建上下文,然后将
.
绑定安装到
/app
上;如果您
docker-compose run frontend ls
,您将看到
frontend
子目录,而不是您的应用程序。)

您可以通过删除

volumes:
块来解决此问题。 您的容器将运行图像中内置的代码,而不是其他代码。 最小的功能性 Compose 设置看起来像这样

version: '3.8'
services:
  frontend:
    build: frontend
    ports:
      - '3000:3000'

1
投票

或者您可以更改 docker-compose.yml 中的行,对我有用

volumes:
  - ./:/app

volumes:
  - ./app:/app

1
投票

我在这个问题上花了2天时间,你需要在docker-compose文件中添加

working_dir
以及在dockerfile中指定
WORKDIR

  api:
    container_name: my_app
    build:
      dockerfile: Dockerfile
      context: ./api
    working_dir: /usr/src/app
FROM node:alpine
WORKDIR /usr/src/app
COPY package.json /usr/src/app/
RUN npm install

0
投票

我的配置与OP非常相似,但遇到了相同的错误。有几个人已经正确地确定问题出在

volumes
的配置方式上,但没有人给出能够真正修复 OP 配置的卷映射的解决方案。

问题是这个映射:

volumes:
  - ./:/app

即将

docker-compose.yml
文件所在的顶级目录映射到容器内的
/app
目录。这意味着当容器运行时,容器的
frontend/
目录中只会有
/app
子文件夹,而不是项目文件。发生错误是因为
yarn
现在无法在
package.json
目录中找到
/app
,因为它位于
app/frontend
内部。

我们想要做的是将

frontend
目录映射到
/app
。这就是整个卷部分的样子:

volumes:
  - ./frontend:/app
  - '/app/node_modules'
© www.soinside.com 2019 - 2024. All rights reserved.