我正在尝试使用Dockerfile和docker-compose运行一个简单的react应用。但是,当我运行命令docker-compose up时,它失败并出现以下错误:package.json不存在。我想docker卷装载会以某种方式覆盖此文件。
有人可以告诉我任何解决方法吗?
Dockerfile
FROM node:alpine
WORKDIR /apps
COPY package.json .
RUN npm install
COPY . .
CMD ["npm","run","start"]
Docker-compose.yml
version: '3'
services:
react-app:
build:
context: .
dockerfile: Dockerfile.dev
ports:
- "3000:3000"
volumes:
- /apps/node_modules
- ./:/apps
输出
docker-compose up --build
Building react-app
Step 1/6 : FROM node:alpine
---> ebbf98230a82
Step 2/6 : WORKDIR /apps
---> Using cache
---> 52ab3e742158
Step 3/6 : COPY package.json .
---> Using cache
---> b88a10e48c6f
Step 4/6 : RUN npm install
---> Using cache
---> 1da097307540
Step 5/6 : COPY . .
---> Using cache
---> c748991eb661
Step 6/6 : CMD ["npm","run","start"]
---> Using cache
---> e138b3c17689
Successfully built e138b3c17689
Successfully tagged frontend_react-app:latest
Starting 86e0c20b7955_frontend_react-app_1 ... done
Attaching to 86e0c20b7955_frontend_react-app_1
86e0c20b7955_frontend_react-app_1 | npm ERR! path /apps/package.json
86e0c20b7955_frontend_react-app_1 | npm ERR! code ENOENT
86e0c20b7955_frontend_react-app_1 | npm ERR! errno -2
86e0c20b7955_frontend_react-app_1 | npm ERR! syscall open
86e0c20b7955_frontend_react-app_1 | npm ERR! enoent ENOENT: no such file or directory, open '/apps/package.json'
86e0c20b7955_frontend_react-app_1 | npm ERR! enoent This is related to npm not being able to find a file.
86e0c20b7955_frontend_react-app_1 | npm ERR! enoent
86e0c20b7955_frontend_react-app_1 |
86e0c20b7955_frontend_react-app_1 | npm ERR! A complete log of this run can be found in:
86e0c20b7955_frontend_react-app_1 | npm ERR! /root/.npm/_logs/2019-02-12T14_36_59_257Z-debug.log
86e0c20b7955_frontend_react-app_1 exited with code 254
文件夹结构
--node_modules
--package.json
--Dockerfile.dev
--Docker-compose.yml
编辑---
尝试使我的应用对源代码中的更改做出反应,而无需重建映像。为此,我需要此绑定安装才能工作。
答案 0 :(得分:2)
确实,您在启动内容时会覆盖/app
目录。
您正在使用 bind mount ,它与 volume 相反,总是用主机文件夹的内容覆盖容器的文件夹。
我怀疑您是否需要此安装-您的应用程序正在构建阶段被复制。只需从docker-compose.yml
中删除此行即可享受。
答案 1 :(得分:-1)
我不知道为什么,但是在docker-compose.yml文件中进行以下操作对我有用。
volumes:
- '.:/apps/'
- /apps/node_modules/
基本上,我将第一个安装座用单引号括起来:p