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

问题描述 投票:0回答:2

我使用烧瓶和芹菜库的项目。我已在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

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

python docker flask celery amazon-ecr
2个回答
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

0
投票

您可以启动所需的任何映像,包括您自己构建的映像,都可以启动Dockerfile FROM。如果您将Flask图片构建为

docker build -t me/flaskapp .

然后您可以构建一个派生图像,该图像将覆盖其CMD as >>

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

© www.soinside.com 2019 - 2024. All rights reserved.