如何为烧瓶和芹菜应用程序创建通用的基本docker映像

时间:2020-04-14 06:52:59

标签: python docker flask celery amazon-ecr

我使用烧瓶和芹菜库的项目。我已在AWS ECS Fargate中部署了我的应用程序。这是烧瓶和芹菜的两个docker文件。

# 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

对于celery和flask应用程序,两个docker文件都相同。有没有一种方法可以创建两个docker文件中的通用基本映像文件?我正在使用AWS ECR存储docker映像。

2 个答案:

答案 0 :(得分:2)

您可以启动任何所需的映像,包括您自己构建的映像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 Worker看起来没有网络侦听器。 (不过,“ Expose”作为动词在现代Docker中几乎没有任何意义。)

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

@Frank's answer建议使用Docker Compose路径。如果您通常使用Compose,则可能更喜欢该路径,因为没有一种简单的方法可以使它以正确的依赖关系顺序构建多个图像。所有运行容器的方法都有一种方法来指定备用命令(通过Kubernetes容器docker run设置中的其他command:选项),因此这并不是特别限制的方法。相反,在CI环境中,通常可以指定要依次构建的多个内容,但您可能需要use an ARG to specify the image tag

答案 1 :(得分:1)

我认为您可以使用docker-compose(https://docs.docker.com/compose/)。 您可以在docker-compose YAML配置文件中指定多个docker实例,然后基于同一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