Docker:构建映像时无法从父目录复制

tve*_*rdo 2 django ubuntu docker docker-compose

我正在尝试用于docker-compose up -d部署我的 django 应用程序。问题是 myDockerfile和位于一个目录中,但需要从父目录docker-compose.yml访问 a 。requirements.txt

最小示例:

文件结构:

requirements.txt (file)  
docker (directory)  
  docker/Dockerfile (file)  
  docker/docker-compose.yml (file)
Run Code Online (Sandbox Code Playgroud)

Dockerfile:

FROM python:3.10-slim
COPY ./../requirements.txt /requirements.txt
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml:

version: '3'

services:

  django:
    container_name: django_123
    build:
      context: ./..
      dockerfile: ./docker/Dockerfile
    expose:
      - "8000"
Run Code Online (Sandbox Code Playgroud)

该设置适用于 Windows 10 上的 Docker Desktop 4,但不适用于 Ubuntu 22。
我收到错误:

Step 1/2 : COPY ./../requirements.txt /requirements.txt
COPY failed: forbidden path outside the build context: ../requirements.txt ()
ERROR: Service 'django' failed to build : Build failed
Run Code Online (Sandbox Code Playgroud)

我已经读到我应该从父目录构建图像,但是如果我使用docker build -f ../Dockerfile ..

可能是什么问题呢?为什么它可以在 Windows 上运行而不能在 Ubuntu 上运行?

Han*_*ian 5

出于安全原因,您只能从设置为“构建上下文”及以下的目录进行复制。COPY ./../requirements.txt不允许这样做,因为这将从构建上下文之上的目录进行复制。

由于您已将构建上下文设置为父目录,因此您应该能够获取需求文件。您只需将主机文件路径指定为源自构建上下文,如下所示:

COPY ./requirements.txt /requirements.txt
Run Code Online (Sandbox Code Playgroud)