这是我的项目结构
.
├── 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),但稍后找不到它。希望有人能帮助我
因为您已经在workdir
app
中,正如您之前定义的WORKDIR
一样。因此将行更改为:
COPY ./package.json /package.json
您的
volumes:
块正在用完全不同的内容替换容器中的 /app
目录。 (您使用 frontend
子目录作为构建上下文,然后将 .
绑定安装到 /app
上;如果您 docker-compose run frontend ls
,您将看到 frontend
子目录,而不是您的应用程序。)
您可以通过删除
volumes:
块来解决此问题。 您的容器将运行图像中内置的代码,而不是其他代码。 最小的功能性 Compose 设置看起来像这样
version: '3.8'
services:
frontend:
build: frontend
ports:
- '3000:3000'
或者您可以更改 docker-compose.yml 中的行,对我有用
volumes:
- ./:/app
到
volumes:
- ./app:/app
我在这个问题上花了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
我的配置与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'