运行计时器触发器时Azure容器实例未终止

时间:2020-06-10 11:30:14

标签: azure azure-function-app azure-container-instances

我已将dockerized Azure函数计时器触发器部署到Azure容器实例。计时器触发器计划在6:00 AM运行。它按预期运行。我的问题是即使计时器触发完成后容器也不会终止。因此,ACI收费是24小时而不是5分钟。我已将重启策略设置为“从不”。

FROM mcr.microsoft.com/azure-functions/python:3.0-python3.7


ENV AzureWebJobsScriptRoot=/home/site/wwwroot \
    AzureFunctionsJobHost__Logging__Console__IsEnabled=true \
    AzureWebJobsStorage="DefaultEndpointsProtocol=https;AccountName=XXXX;AccountKey=XXXXXX;EndpointSuffix=core.windows.net"

ENV SITESPEED_IO_BROWSERTIME__XVFB true
ENV SITESPEED_IO_BROWSERTIME__DOCKER true
ENV WEBSITE_TIME_ZONE="India Standard Time"

RUN apt-get update \
    && apt-get install -y \
        build-essential \
        cmake \
        git \
        wget \
        unzip \
    && rm -rf /var/lib/apt/lists/*

RUN apt-get update && apt-get install -y --no-install-recommends \
    unixodbc-dev \
    unixodbc \
    libpq-dev 



ARG CHROME_VERSION="google-chrome-stable"
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \
  && echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list \
  && apt-get update -qqy \
  && apt-get -qqy install \
    ${CHROME_VERSION:-google-chrome-stable} \
  && rm /etc/apt/sources.list.d/google-chrome.list \
  && rm -rf /var/lib/apt/lists/* /var/cache/apt/*


RUN LATEST=$(wget -q -O - http://chromedriver.storage.googleapis.com/LATEST_RELEASE) && \
    wget http://chromedriver.storage.googleapis.com/$LATEST/chromedriver_linux64.zip && \
    unzip chromedriver_linux64.zip && rm -rf chromedriver_linux64.zip && ln -s $PWD/chromedriver /usr/local/bin/chromedriver

ENV PATH="/usr/local/bin/chromedriver:${PATH}"


COPY . /home/site/wwwroot

RUN pip install --upgrade pip


COPY ./requirements.txt /app/
RUN cat /app/requirements.txt | xargs -n 1 pip install ; exit 0

RUN cd /home/site/wwwroot && \
    pip install -r requirements.txt

计时器触发文件。

import datetime
import logging
import os
import azure.functions as func
import json

from ..utility import ablob_utils
from ..utility.db_utils_sql import DB
from ..utility import mail_trigger



def main(mytimer: func.TimerRequest) -> None:


    script_dir = os.path.dirname(__file__)
    abs_file_path = os.path.join(script_dir, "../settings.json")
    logging.info("Absolute path: %s ", abs_file_path)

    with open(abs_file_path) as settings:
        logging.info("Settings json value %s", settings)
        settingJsonObject = json.load(settings)

    utc_timestamp = datetime.datetime.utcnow().replace(
        tzinfo=datetime.timezone.utc).isoformat()

   # Trigger Scrapper

    scraper_exec = xxxx.xxx_scraper(
                    ablob_utils.BLOB_DB,  settingJsonObject).scrape_rrrr()

    if scraper_exec['status']:
        # Trigger DB Update
        logging.info('insert db function ran at %s', utc_timestamp)
        yyyy.cccc(
            ablob_utils.BLOB_DB, DB, settingJsonObject).insert_to_db()
        logging.info('insert db function completed at %s', utc_timestamp)

        logging.info(
            'timer trigger function completed at %s', utc_timestamp)
    else:

        mail_trigger.trigger(scraper_exec['msg'])

1 个答案:

答案 0 :(得分:1)

Azure容器实例的终止取决于您使用的图像。如果图像包含连续操作,则直到您将其停止,它才会终止。如果图像中的应用程序仅在一段时间内运行。例如5分钟,然后容器实例将在运行状态5分钟后终止。或映像中的应用程序有问题,并导致容器实例终止。重新启动策略仅在容器终止时起作用,而无法终止容器。因此,如果您想完全终止,我建议第一种情况。

更新

这是您的选择。如果您不想每天24小时使用ACI付款,则需要停止或删除ACI。如果要每个周期在ACI中运行计时器触发器,则需要为此付费。也许可以在完成收集数据后尝试使用逻辑应用来安排工作流程,以创建和删除ACI。

您跟踪的链接仅在ACI(而不是函数)中运行计时器触发器。如果使用Azure函数计时器触发器,则不需要使用ACI。