使用compose运行docker容器时,npm无法找到package.json

时间:2019-04-09 09:06:52

标签: docker npm docker-compose

我正在尝试将Angular 7客户端应用程序连接到本地的docker compose中。

泊坞窗组成时出现以下错误:

client-app    | npm ERR! errno -2
client-app    | npm ERR! syscall open
client-app    | npm ERR! enoent ENOENT: no such file or directory, open '/app/package.json'

Dockerfile:

FROM node:9.6.1

RUN mkdir -p /app
WORKDIR /app
EXPOSE 4200

ENV PATH /app/node_modules/.bin:$PATH

COPY . /app

RUN npm install --silent
RUN npm rebuild node-sass

CMD ["npm", "run", "docker-start"]

客户的组成部分是:

  client-app:
    image: ${DOCKER_REGISTRY-}client
    container_name: client-app
    ports:
      - "4200:81"
    build:
      context: .
      dockerfile: ClientApp/Dockerfile

package.json位于Dockerfile的ClientApp文件夹中,我假设为COPY。 / app应该将package.json复制到容器中。我在dockerignore中没有任何排除项。我正在将Docker用于Windows和Unix容器。我之前尝试过npm init(但是无论如何都会创建一个空的package.json),并仔细查看SO帖子,但是大多数dockerfile定义看起来完全一样。我还尝试了:COPY package * .json ./并使用--no-cache构建映像。

2 个答案:

答案 0 :(得分:1)

此命令<script src="/js/jquery.min.js"></script> <script src="/js/jquery-ui.js"></script> <script src="/js/bootstrap.min.js"></script> 将尝试从根目录复制COPY package*.json ./。但是,您似乎需要从package.json目录中复制package.json

两种解决方法: 1)更改撰写文件ClientApp 2)更改docker文件context: ./ClientApp/

我认为最好更改docker文件,因为在功能中您可能希望从根目录复制一些文件

答案 1 :(得分:1)

您的Dockerfile很好,并且不需要COPY package*.json ./-它将与您的整个应用程序一起复制。

问题在于您的docker-compose文件。

您定义的:

build:
      context: .
      dockerfile: ClientApp/Dockerfile

这意味着您的Dockerfile将接受docker-compose上下文,该上下文位于上面的1个目录中:

├── docker-compose.yml -- this is the actual context
└── ClientApp
    ├── Dockerfile -- this is the expected context

因此,当CMD运行时,它位于package.json上方的1个目录中,因此它无法运行该命令,并且容器将退出。

要修复此问题,请为您的docker-compose文件提供正确的上下文:

build:
      context: ClientApp
      dockerfile: Dockerfile

它应该可以工作。