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