docker-compose-添加失败:构建上下文之外的禁止路径

时间:2019-01-21 09:51:16

标签: docker docker-compose

我有这样的文件夹结构

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:

4 个答案:

答案 0 :(得分:3)

上下文

这都是关于上下文的。在构建中指定上下文和dockerfile,然后可以将Dockerfile植入任何地方。和她一起玩(这就是她所说的)。

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


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

答案 1 :(得分:2)

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

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

将构建上下文设置到根文件夹并明确指定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

答案 2 :(得分:1)

_______________________________
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

您的容器将具有从项目根目录开始的所有内容。

答案 3 :(得分:0)

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

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