Docker-compose - Ошибка добавления: запрещенный путь вне контекста сборки

у меня такая структура папок

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

Докерфайл

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

докер-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, я получаю следующую ошибку:

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

Можно ли добавить файл requirements.txt или мне придется скопировать этот файл в каталог докеров? Или, может быть, мне нужно использовать любую точку входа (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 уровня выше контекста ../../? Это не разрешено, вы должны переместить файл.

Boris van Katwijk 21.01.2019 10:57

@BorisvanKatwijk - правильно. Я использовал ADD ./requirements, и он работает

Headmaster 21.01.2019 11:00

Возможный дубликат Как включить файлы вне контекста сборки Docker?

David Maze 21.01.2019 12:45
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
17
3
27 800
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы не можете выйти за пределы контекста сборки (который обычно является рабочим каталогом) Docker при создании образа.

Причина довольно проста - Docker состоит из клиента командной строки и демона, когда вы вызываете docker build ..., первое, что происходит, это то, что ваш клиент упаковывает всю папку (контекст сборки) в один архив и отправляет его демону вместе с вашим Dockerfile. Демон получает архив и инструкции от Dockerfile, а это означает демон не имеет доступа к вашей локальной файловой системе при сборке образа и не может проходить по ссылкам ../...

Что вам нужно, чтобы установить контекст сборки в корневую папку и явно указать Dockerfile.

Ваша команда сборки будет выглядеть

docker build -f config/docker/Dockerfile .

И внутри Dockerfile вы должны помнить, что все пути относятся к корню проекта.

Итак, наконец, вы пришли к следующему файлу компоновки:

докер-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/?

Headmaster 21.01.2019 11:21

Где ваш код изначально? В src? Потом ADD src /code/.

grapes 21.01.2019 11:26

Полагаю, я делаю что-то не так. После запуска docker-compose up я не вижу там своего кода

Headmaster 21.01.2019 11:31

это пустая папка

Headmaster 21.01.2019 11:48

может я неправильно запускаю docker-compose up? как должно быть?

Headmaster 21.01.2019 11:50

Это просто дает мне ошибку Cannot locate specified Dockerfile: config/docker/Dockerfile

Cerin 16.05.2019 20:30

Критический аспект этого ответа, который не был очевиден для меня, заключается в том, что затем вы изменяете отдельные Dockerfile, чтобы отразить контекст build. Таким образом, это не ../blarg, а просто blarg, так как это контекст сборки docker-compose.yml. Спасибо!

Max von Hippel 27.09.2020 21:33

Надеюсь, мой ответ кому-нибудь поможет (он основан на многих репозиториях GitHub, хотя я смотрел)

У меня неправильная структура проекта. Если вам нужно разделить файлы докера и код приложения, лучше поместить код в любую папку (например, app) в корневой папке. Файлы Docker также должны находиться в корневой папке. Такая структура позволит избежать многих проблем и будет легко использовать docker/docker-compose.

Ответ принят как подходящий

контекст

Все дело в контексте. Укажите контекст и файл dockerfile в своей сборке, и вы сможете разместить свой файл Dockerfile где угодно. Поиграй с ним (так она сказала).

Я бы по крайней мере сохранил docker-compose.yaml в корневом каталоге.


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

Это не работает, если вы хотите найти файл docker-compose.yaml в подпапке. Если у вас есть один глобальный файл docker-compose, это противоречит цели помещения Dockerfile во вложенную папку. Затем вам потребуется использовать этот глобальный файл docker-compose.yaml для всего, даже если вы хотите описать отдельные коллекции контейнеров.

Cerin 16.05.2019 23:21

Один глобальный docker-compose ничего не побеждает.

Bicameral Mind 13.06.2019 21:13

Большинство людей запускают один docker-compose, чтобы создавать свои образы прямо.

Bicameral Mind 13.06.2019 21:13

Я запускаю несколько микросервисов с их собственным файлом Dockerfile в соответствующих подкаталогах — используя один docker-compose для сборки всех образов, или я запускаю docker-compose build <image> для создания конкретных. Зависит от службы, сценария и т. д., которые я подаю. Нет необходимости иметь несколько файлов docker-compose вместе с Dockerfiles. Никому не нужны дополнительные yaml-файлы для создания докеров с любым количеством строк в каждом, когда вы можете просто вставить его в скрипт, используя тот же самый docker-compose.

Bicameral Mind 13.06.2019 21:13

Так что да, когда дело доходит до контекста — ответ именно об этом! Это работает отлично. Даже если вы хотите тратить время на размещение дополнительных файлов в каталогах, которые в противном случае не нужны.

Bicameral Mind 13.06.2019 21:13
_______________________________
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

И в вашем контейнере будет все из корня проекта.

Другие вопросы по теме