首页 > 解决方案 > 复制 npmrc 时 Docker compose 失败

问题描述

尝试使用 docker compose 运行我的 docker 时出现此错误

=> 错误 [6/9] COPY .npmrc .npmrc
0.0s => 错误 [7/9] 添加 package.json /Users/gs/Documents/Dev/DockerDi 0.0s


version: "3"
   
services:
  gs-service:
    build:
      context: .
      dockerfile: ./gs/Dockerfile
    ports:
      - 8081:8081
   
  ui-service:
    build:
      context: .
      dockerfile: ./ui/Dockerfile
    ports:
      - 8083:8083

这是失败的 Dockerfile 的详细信息。这是一个子目录。例如/user/gs/dockerexperiment/ui

我知道课程路径出了点问题,但我很难弄清楚我错过了什么

标签: dockerdocker-compose

解决方案


Dockerfile 在构建上下文上运行;这是您build: { context: }docker-compose.yml文件中命名的目录树的副本(或者,如果您docker build直接使用它的目录参数)。

build:
  context: .

在 Dockerfile 中,任何COPY(或ADD)指令都被解释为相对于该目录树。(如果它看起来像一个绝对路径,它仍然是相对于这个目录的;任何..会超出这个目录的路径步骤都会被忽略。)

COPY package*.json ./
# copies ./package.json, relative to the context directory

但是,您在评论中澄清,这实际上不是您的文件所在的位置。相对于docker-compose.yml文件,你需要./ui/package.json; Dockerfile 也在同一个子目录中。

您显示的 Dockerfile 似乎不需要来自其直接树之外的任何内容,因此解决此问题的最简单方法是将ui目录设置为构建上下文:

version: '3.8'
services:
  ui:
    build: ./ui
    # Same as
    # build:
    #   context: ./ui
    #   dockerfile: Dockerfile # relative to the context directory
    ports:
      - 8085:8085

在 Dockerfile 中,你可以删除重复的ADD package.json行,你应该删除危险的RUN npm set config行。你也可以设置一个更短的WORKDIR,比如/app典型的。

如果您不想更改docker-compose.yml文件,另一个可能的更改是调整 Dockerfile 以使其COPY路径相对于(父)构建上下文目录。

COPY ui/package*.json .

这样做的好处是您可以根据需要从其他应用程序访问文件,或者您可以将共享文件存储在该父目录中。

FROM node:14

# Add the public TLS key for our internal repository
# (from the parent directory)
COPY repository.example.com.crt /usr/local/share/ca-certificates
RUN update-ca-certificates

WORKDIR /app

# Also get our local npm configuration (from the parent directory)
COPY .npmrc .

# Install the ./ui application
COPY ui/package*.json .
RUN npm ci
COPY ui/src ./src
EXPOSE 8085
CMD ["npm", "start"]

推荐阅读