Как создать общий базовый docker образ для flask и приложений сельдерея - PullRequest
0 голосов
/ 14 апреля 2020

Мой проект с использованием flask и библиотек сельдерея. Я развернул свое приложение в AWS ECS Fargate. Вот два docker файла для flask и сельдерея.

# Flask Docker File
FROM python:3.6

RUN apt-get update -y

RUN pip3 install pipenv

ENV USER dockeruser
RUN useradd -ms /bin/bash $USER

ENV APP_PATH /home/$USER/my_project
RUN mkdir -p $APP_PATH
COPY . $APP_PATH
WORKDIR $APP_PATH

RUN chown -R $USER:$USER $APP_PATH

RUN pipenv install --system --deploy

USER $USER

EXPOSE 5000

CMD gunicorn run:my_app -b 0.0.0.0:5000 -w 4
# Celery Docker File
FROM python:3.6

RUN apt-get update -y

RUN pip3 install pipenv

ENV USER dockeruser
RUN useradd -ms /bin/bash $USER

ENV APP_PATH /home/$USER/my_project
RUN mkdir -p $APP_PATH
COPY . $APP_PATH
WORKDIR $APP_PATH

RUN chown -R $USER:$USER $APP_PATH

RUN pipenv install --system --deploy

USER $USER

CMD celery -A celery_tasks.celery worker -l INFO -E --autoscale=2,1 -Q apple,ball,cat

Оба docker файла одинаковы для сельдерея и flask приложения. Есть ли способ создать общий файл базового образа для обоих файлов docker? Я использую AWS ECR для хранения docker изображений.

Ответы [ 2 ]

2 голосов
/ 14 апреля 2020

Вы можете запустить Dockerfile FROM любое изображение, которое вы хотите, включая то, которое вы создали сами. Если вы создали Flask изображение как

docker build -t me/flaskapp .

, то вы можете создать производное изображение, которое просто переопределяет его CMD как

FROM me/flaskapp
CMD celery -A celery_tasks.celery worker -l INFO -E --autoscale=2,1 -Q apple,ball,cat

Если вы предпочитаете, вы можете иметь изображение это включает в себя исходный код, но не по умолчанию CMD. Поскольку вы не можете отключить EXPOSE порт, это имеет небольшое преимущество в том, что не похоже, что у вашего работника Celery есть сетевой слушатель. («Expose» как глагол в современном Docker почти ничего не значит.)

FROM me/code-base
EXPOSE 5000
CMD gunicorn run:my_app -b 0.0.0.0:5000 -w 4

@ Ответ Фрэнка предполагает Docker Compose path. Если вы регулярно используете Compose, вы можете предпочесть этот путь, поскольку нет простого способа заставить его создавать несколько изображений в правильном порядке зависимости. Во всех способах запуска контейнера есть способ указать альтернативную команду (от дополнительных опций docker run до настройки Kubernetes pod command:), так что это не особенно ограничивающий подход. И наоборот, в среде CI вы, как правило, можете указать несколько вещей для построения в последовательности, но вы, вероятно, захотите использовать ARG для указания тега изображения .

1 голос
/ 14 апреля 2020

Я думаю, вы можете использовать docker -композицию (https://docs.docker.com/compose/). Вы можете указать более 1 docker экземпляра внутри docker -компонента файла конфигурации YAML и запустить его на основе того же docker образа.

Один пример:

test.yaml:

version: '2.0'
services:
  web:
    image: sameimage
    ports:
    - "5000:5000"
    volumes:
    - .:/code
    - logvolume01:/var/log
    links:
    - redis
    command: ["gunicorn", "run:my_app", "-b", "0.0.0.0:5000", "-w", "4"]
  celery:
    image: sameimage
    command: ["celery", "-A", "celery_tasks.celery"]
volumes:
  logvolume01: {}

Вы можете запустить его:

docker-compose -f test.yaml -p sameiamge up --no-deps
...