【问题标题】:docker-compose - ADD failed: Forbidden path outside the build contextdocker-compose - 添加失败:构建上下文之外的禁止路径
【发布时间】:2019-01-21 09:51:16
【问题描述】:

我有这样的文件夹结构

project
    - config
        -docker
           Dockerfile
           docker-compose.yml
    - src
       here_is_code
    requirements.txt

Dockerfile

FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD ../../requirements.txt /code/
RUN pip install -r requirements.txt
ADD src /code/

docker-compose.yml

version: '3'

services:
  web:
    build:
      context: ../../
      dockerfile: config/docker/Dockerfile
    command:
        bash -c "ls"
    volumes:
      - .:/code
    expose:
      - "8000"
  nginx:
    image: nginx
    ports:
    - "8000:8000"
    volumes:
      - .:/code
      - ./config/nginx:/etc/nginx/conf.d
    depends_on:
    - web

当我运行docker-compose build 时出现以下错误:

服务“web”构建失败:添加失败:构建上下文之外的禁止路径:../../requirements.txt ()

是否可以添加 requirements.txt 或者我必须将此文件复制到 docker 目录中?或者我可能需要使用任何入口点 (entrypoint.sh)?

更新

docker build -f config/docker/Dockerfile .docker-compose up 之后,我在那里看不到我的代码。这是ls -R /code的输出

web_1    | /code:
web_1    | Dockerfile
web_1    | config
web_1    | docker-compose.yml
web_1    | src
web_1    | static
web_1    | 
web_1    | /code/config:
web_1    | nginx
web_1    | 
web_1    | /code/config/nginx:
web_1    | 
web_1    | /code/src:
web_1    | static
web_1    | 
web_1    | /code/src/static:
web_1    | 
web_1    | /code/static:

【问题讨论】:

  • 我认为如果你有context: ../../,你就不再意味着指向ADD ../../requirements,而是指向ADD ./requirements。或者这个文件是否比上下文../../ 高 2 级?这是不允许的,你应该移动文件。
  • @BorisvanKatwijk - 对。我用过ADD ./requirements,它可以工作

标签: docker docker-compose


【解决方案1】:

上下文

一切都与上下文有关。在您的构建中指定上下文和 dockerfile,您可以在任何地方放置您的 Dockerfile。玩一局(她是这么说的)。

我至少会将 docker-compose.yaml 保存在根目录中。


build:
  context: .
  dockerfile: dockerfiles/project-one/Dockerfile

【讨论】:

  • 如果您也想在子文件夹中找到 docker-compose.yaml 文件,这不起作用。如果你有一个全局的 docker-compose 文件,那就违背了将 Dockerfile 放在子文件夹中的目的。然后,您需要对所有内容使用该全局 docker-compose.yaml 文件,即使您想描述单独的容器集合。
  • 一个全球性的 docker-compose 什么都不会。
  • 大多数人都在运行一个 docker-compose 来直接构建他们的图像。
  • 我在各自的子目录中使用自己的 Dockerfile 运行多个微服务——使用一个 docker-compose 来构建所有图像,或者我运行 docker-compose build 来构建特定的那些。取决于我正在应用的服务、脚本等。不需要在 Dockerfile 旁边有多个 docker-compose 文件。没有人需要额外的 docker-compose yamls,每行有多少行,当您可以使用相同的 docker-compose 在脚本中只写一行时。
  • 所以,是的,当涉及到上下文时——这就是答案的意义所在!它完美地工作。即使您想浪费时间在不需要的目录中放置额外的文件。
【解决方案2】:

在构建映像时,您不能离开 Docker 的构建上下文(通常是工作目录)。

原因很简单 - Docker 由命令行客户端和守护进程组成,当您调用 docker build ... 时,首先发生的事情是您的客户端将整个文件夹(构建上下文)打包到单个存档中,并将其与您的 @ 一起发送到守护进程987654322@。 Daemon 从Dockerfile 获取存档和说明,这意味着daemon 在构建映像时不会访问您的本地文件系统,并且无法遍历../.. 引用。

您需要将构建上下文设置为根文件夹并明确指定Dockerfile

你的构建命令看起来像

docker build -f config/docker/Dockerfile .

Dockerfile 中,您必须记住所有路径都相对于项目根目录。

所以最后你来了以下撰写文件:

docker-compose.yml

version: '3'
services:
  web:
    build:
      context: .  # here changed
      dockerfile: config/docker/Dockerfile
    command: ["bash", "-c", "ls"]
    expose:
      - "8000"
  nginx:
    image: nginx
    ports:
      - "8000:8000"
    depends_on:
      - web

你进入项目根目录并运行

docker-compose -f config/docker/docker-compose.yml up

【讨论】:

  • 那么最后一行ADD . /code/应该是怎样的?
  • 你的代码原来在哪里?在src?然后ADD src /code/.
  • 猜猜,我做错了什么。在我运行docker-compose up 之后,我看不到我的代码
  • 这是一个空文件夹
  • 也许我以错误的方式运行docker-compose up?应该怎么样?
【解决方案3】:

希望,我的回答对某人有所帮助(它基于许多 GitHub 存储库,不过我已经查看过)

我有错误的项目结构。如果需要分离 docker 文件和应用程序代码,最好将代码放在根文件夹中的任意文件夹(例如称为app)中。 Docker 文件也应该在根文件夹中。这样的结构会避免很多问题,并且使用docker/docker-compose很容易

【讨论】:

    【解决方案4】:
    _______________________________
    deployments/docker-compose.yml:
    [...]
    service_name:
      build:
          context: ..                           # *That's what you need!*
          dockerfile: build/package/Dockerfile
    
    _________________________
    build/package/Dockerfile:
    [...]
    COPY . .
    
    _____________________
    from root of project:
    
    docker-compose -f deployments/docker-compose.yml up
    

    您的容器将包含项目根目录中的所有内容。

    【讨论】:

      猜你喜欢
      • 2020-07-26
      • 2019-10-04
      • 1970-01-01
      • 2019-04-22
      • 1970-01-01
      • 1970-01-01
      • 2018-06-15
      • 2020-08-06
      • 2020-06-15
      相关资源
      最近更新 更多