【发布时间】:2021-07-26 20:21:11
【问题描述】:
我是在 Azure 中运行容器的新手,我对下面的用例感到困惑, 如果您觉得我错误地使用了容器,请随时给我另一种方法。
核心问题:我无法/不知道如何通过命令行或 ARM 模板部署创建处于“停止”状态的容器实例
长读用例:
我创建了一个运行 python 作业的 docker 映像。
作业需要每天运行,并通过数据工厂触发。数据工厂将找出环境,设置 docker 命令,更新容器镜像,然后通过批处理帐户执行容器。作业本身执行 api 调用并将一些数据写入 sql。这部分工作正常,容器状态进入运行并随后停止(我关闭了自动重启)
在 Azure DevOps 中,我有一个构建作业映像并将其存储在 azure 存储库中的管道。这工作正常。
由于我需要一个容器实例作为资源组中的资源,因此我决定将它们放入我的 infra ARM 模板中。问题:使用 DevOps/Arm 模板部署部署容器时, 它部署并运行作业实例,这不是很好,我希望在“停止”状态下创建容器。原因是该作业将数据写入我们的数据库,这是不需要的。
我想知道什么是最好的方法/什么是最好的指导方针,我考虑过这两种情况,但对于这两种情况,我的直觉都说不。
场景 1:拥有一个一直在运行的容器(让它执行 bin/bash)并使用“az container exec”传递命令。 为什么我不想这样做:我目前每个环境都有一个图像,该图像具有该环境的确切工作,我看不到让 3 个备用容器一直运行并每天触发一次的用处
场景 2:不通过 DevOps 处理容器实例创建,而是忽略问题并使用数据工厂和批处理帐户创建它。这意味着,当触发作业时,它将创建(并因此运行容器)。随后,我可以在使用后将其删除。
为什么我不想这样做:我将容器实例视为基础架构的一部分(因为它是您在资源组中部署的东西,如果我的观点有误,请纠正我)所以从这个意义上说,通过计划的数据工厂作业管理资源看起来不太好,这是一种解决无法在停止状态下部署容器实例的问题的技巧。
# set base image (host OS)
FROM python:3.7-buster
# Argument for environment selection
ARG environment
ENV environment ${environment}
# set the working directory in the container
WORKDIR /
# copy the dependencies file to the working directory
COPY requirements.txt .
# install FreeTDS and dependencies
RUN apt-get update && apt-get -y install apt-transport-https curl
RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
RUN curl https://packages.microsoft.com/config/debian/10/prod.list > /etc/apt/sources.list.d/mssql-release.list
RUN exit
RUN apt-get update
RUN ACCEPT_EULA=Y apt-get -y install msodbcsql17
RUN apt-get install unixodbc-dev
RUN pip install pyodbc
RUN pip install -r requirements.txt
# copy the content of the local src directory to the working directory
COPY /src .
# command to run on container start
CMD python "./my_data_job.py" "./my_config.ini" ${environment}
【问题讨论】:
-
关于这个问题的任何更新?它解决了你的问题吗?
-
或多或少,我知道现在只在需要时启动它们是可以的。我通过告诉我的批处理帐户创建(并因此运行)容器实例然后将其删除来解决了这个问题。我还与 Microsoft 的联系人进行了核对,他们在我的资源组中出现和消失的事实没有发现任何问题,这就是他们缩进它的工作方式。
标签: azure docker containers azure-container-instances