部署 Azure 容器而不运行它们

时间:2021-05-04 13:17:57

标签: azure docker containers azure-container-instances

我是在 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}

1 个答案:

答案 0 :(得分:1)

对于 Azure 容器实例,容器组将始终处于运行状态,直到您将其停止。但是其中的容器可以处于终止状态。事实上,如果您的镜像是一次性镜像,那么当作业完成时容器将处于终止状态。您可以根据需要使用 CLI 命令 az container exec 再次运行该作业。

因此无法在停止状态下创建 ACI。也许你可以使用 AKS,为不同的环境创建不同的部署,当你需要一个容器来运行作业时,然后扩展到一个副本。当您不需要容器时,您可以缩小到零。

相关问题