Docker-compose覆盖package.json

时间:2019-02-12 14:42:25

标签: docker docker-compose docker-volume

我正在尝试使用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

编辑---

尝试使我的应用对源代码中的更改做出反应,而无需重建映像。为此,我需要此绑定安装才能工作。

2 个答案:

答案 0 :(得分:2)

确实,您在启动内容时会覆盖/app目录。

您正在使用 bind mount ,它与 volume 相反,总是用主机文件夹的内容覆盖容器的文件夹。

我怀疑您是否需要此安装-您的应用程序正在构建阶段被复制。只需从docker-compose.yml中删除此行即可享受。

答案 1 :(得分:-1)

我不知道为什么,但是在docker-compose.yml文件中进行以下操作对我有用。

volumes:
      - '.:/apps/'
      - /apps/node_modules/

基本上,我将第一个安装座用单引号括起来:p