关于docker-compose:docker-compose – ADD失败:构建上下文之外的禁止路径

docker-compose - ADD failed: Forbidden path outside the build context

我有这样的文件夹结构

1
2
3
4
5
6
7
8
project
    - config
        -docker
           Dockerfile
           docker-compose.yml
    - src
       here_is_code
    requirements.txt

文档文件

1
2
3
4
5
6
7
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公司

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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时,我得到以下错误:

Service 'web' failed to build: ADD failed: Forbidden path outside the build context: ../../requirements.txt ()

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

更新

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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:


语境

一切都是关于环境的。在构建中指定上下文和dockerfile,您可以将dockerfile放在任何地方。玩一局(她就是这么说的)。

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

1
2
3
build:
  context: .
  dockerfile: dockerfiles/project-one/Dockerfile


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

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

您需要设置根文件夹的构建上下文并显式指定Dockerfile的内容。

您的build命令看起来像

1
docker build -f config/docker/Dockerfile .

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

最后,您将看到以下组合文件:

docker-compose.yml公司

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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

您转到项目根目录并运行

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


希望,我的答案会对某些人有所帮助(尽管我已经看过很多Github存储库)

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