复制失败:Docker Compose禁止构建上下文之外的路径

10

这是项目结构。

Project
 /deployment
   /Dockerfile
   /docker-compose.yml
 /services
   /ui
     /widget

这是 Docker 文件

FROM node:14

WORKDIR /app

USER root

# create new user (only root can do this) and assign owenership to newly created user
RUN echo "$(date '+%Y-%m-%d %H:%M:%S'): ======> Setup Appusr" \
    && groupadd -g 1001 appusr \
    && useradd -r -u 1001 -g appusr appusr \
    && mkdir /home/appusr/ \
    && chown -R appusr:appusr /home/appusr/\
    && chown -R appusr:appusr /app

# switch to new created user so that appuser will be responsible for all files and has access
USER appusr:appusr

COPY ../services/ui/widget/ /app/
COPY ../.env /app/

# installing deps
RUN npm install 

以及docker-compose

版本:"3.4"

x-env: &env
  HOST: 127.0.0.1

services:
  widget:
    build:
      dockerfile: Dockerfile
      context: .
    ports:
      - 3002:3002
    command:
      npm start
    environment:
      <<: *env
    restart: always

执行project/deplyment/docker-compose up后,输出如下:

Step 6/8 : COPY ../services/ui/widget/ /app/
ERROR: Service 'widget' failed to build : COPY failed: forbidden path outside the build context: ../services/ui/widget/ ()

我是否设定了错误的上下文?

2个回答

11

您不能在 Dockerfile 所在的当前路径之外 COPY 或者 ADD 文件。

您应该将这两个目录移动到 Dockerfile 的位置,然后修改您的 Dockerfile

COPY ./services/ui/widget/ /app/
COPY ./.env /app/
使用docker-compose中的volumes,并删除这两个COPY行。

因此,您的docker-compose应如下所示:

x-env: &env
  HOST: 127.0.0.1

services:
  widget:
    build:
      dockerfile: Dockerfile
      context: .
    ports:
      - 3002:3002
    command:
      npm start
    environment:
      <<: *env
    restart: always
    volumes:
      - /absolute/path/to/services/ui/widget/:/app/
      - /absolute/path/to/.env/:/app/

如果您在docker-compose中使用卷,则以下内容应该是您的Dockerfile:

FROM node:14

WORKDIR /app

USER root

# create new user (only root can do this) and assign owenership to newly created user
RUN echo "$(date '+%Y-%m-%d %H:%M:%S'): ======> Setup Appusr" \
    && groupadd -g 1001 appusr \
    && useradd -r -u 1001 -g appusr appusr \
    && mkdir /home/appusr/ \
    && chown -R appusr:appusr /home/appusr/\
    && chown -R appusr:appusr /app

# switch to new created user so that appuser will be responsible for all files and has access
USER appusr:appusr

# installing deps
RUN npm install 

运行 npm install 对我来说不起作用npm ERR! enoent ENOENT: 没有这样的文件或目录,打开 '/app/package.json'我猜是因为容器构建后才可用卷。 - olek07
然后在你的 Dockerfile 中,在 WORKDIR /app 之前添加 COPY . /app,以确保文件被复制。 - Saeed
我尝试了一下这个答案,但是我得到了 ERROR: Duplicate mount points: 的错误。这是我的代码: volumes: - ./build:/usr/src/app/ - ./api/database_changes:/usr/src/app/ - J.Do
1
@J.Do,你不能有两个相同的挂载点(在你的情况下是/usr/src/app/)。你应该将其中一个更改为另一个路径。 - Saeed

9
你的问题是引用了一个超出Dockerfile上下文范围的文件。默认情况下,是执行构建命令的位置。
来自docker文档-拷贝部分
路径必须在构建上下文内;您不能拷贝 ../something /something,因为docker build的第一步是将上下文目录(和子目录)发送到docker守护程序。
但是,您可以使用参数-f独立于运行构建的文件夹指定dockerfile。所以,你可以使用下面这行代码从项目中执行它:
docker build -f ./deployment/Dockerfile .

你需要修改复制的行,将其指向正确的位置。
COPY ./services/ui/widget/ /app/
COPY ./.env /app/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接