部署 Azure 容器而不运行它们

Oli*_*rie 4 containers azure docker azure-container-instances

我是在 Azure 中运行容器的新手,我对下面的用例感到困惑,如果您觉得我错误地使用了容器,请随时给我另一种方法。

核心问题:我无法/不知道如何通过命令行或 ARM 模板部署在“停止”状态下创建容器实例

长读用例:

我创建了一个运行 python 作业的 docker 映像。

该作业需要每天运行并通过数据工厂触发。数据工厂将确定环境、设置 docker 命令、更新容器映像,然后通过批处理帐户执行容器。该作业本身会执行 api 调用并将一些数据写入 sql。这部分工作正常,容器状态进入运行状态,然后停止(我关闭了自动重启)

在 Azure DevOps 中,我有一个管道来构建作业的映像并将其存储在 azure 存储库中。这很好用。

由于我需要一个容器实例作为我的资源组中的资源,因此我决定将它们放入我的基础 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}
Run Code Online (Sandbox Code Playgroud)

Cha*_* Xu 6

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

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