Сборка Dockerfile из родительского каталога - PullRequest
0 голосов
/ 09 января 2019

У меня есть приложение на python, в котором используются работники сельдерея, которые я хотел бы докеризовать. К сожалению, и Python, и Celery используют одну и ту же кодовую базу. Хотя они должны быть отдельными контейнерами для облегчения масштабирования. Если я создаю их отдельно и запускаю контейнеры, это работает нормально. Проблема начинается, когда я представляю docker-compose, поэтому я не могу поменять файлы docker в папке с кодом, и контейнеры должны быть собраны из-за пределов папки. Структура папок следующая:

/application
    /application-build
       Dockerfile
    /celery-build
       Dockerfile
    /code
       application.py
       otherfiles.py

Я немного покопался и, к сожалению, насколько я знаю, файлы из родительского каталога не могут быть скопированы в dockerfile. Хотя я хотел бы скопировать один и тот же код в оба контейнера. (Имейте в виду, что следующие докер-файлы не являются теми, которые я использую.)

Dockerfile1:

FROM python:3.6
ADD /code .
COPY requirements.txt requirements.txt
RUN python3.6 -m pip install -r requirements.txt
CMD ["python3.6", "application.py"]

Dockerfile2:

FROM python:3.6
ADD /code .
COPY /code/requirements.txt .
RUN python3.6 -m pip install -r requirements.txt
CMD ["celery","-A application.celery", "worker","work1@host"]

Одним из решений, которое я вижу, является реорганизация папок так, чтобы каталог кода всегда был дочерним по отношению к каталогу dockerfile, например:

/application
   /application-build
      Dockerfile
      /celery-build
         Dockerfile
         /code
            application.py
            otherfiles.py

Хотя это не выглядит умным.

Ответы [ 2 ]

0 голосов
/ 13 мая 2019

Дополнение ответа винограда с помощью Docker Compose, эквивалентного командам docker build:

# docker-compose.yml
version: '3.7'

services:
  application:
    build:
      context: .
      dockerfile: application-build/Dockerfile

  celery:
    build:
      context: .
      dockerfile: celery-build/Dockerfile
# Run this command in the directory of your `docker-compose.yml` file
# (Which is this question's case would be /application/docker-compose.yml)
docker-compose build

При сборке каждого Dockerfile в качестве контекста сборки будет использоваться /application.

0 голосов
/ 09 января 2019

Нет проблем. В Dockerfile вы не можете получить (доступ к родительской папке) контекст сборки , а не Dockerfile's папка.

Оставьте структуру, как это было, и явно укажите путь к Dockerfile:

docker build -t app -f application-build/Dockerfile . 
docker build -t celery -f celery-build/Dockerfile . 

И внутри вашего Dockerfiles помните, что путь это /application. Таким образом, вы можете легко скопировать:

Dockerfile

...
COPY code /code
...
...