テックラボの高橋です。今回は小ネタです。
Azure App ServiceのContainer Linux環境ではDockerコンテナを動かすことができます。
最近、オブザーバビリティツールであるDatadogをこの環境に組み込む機会がありました。 Datadogのドキュメントによると、以下のようにDockerfileに記述することでDatadogにログやトレースを送ることができるようです。
COPY --from=datadog/serverless-init:1 /datadog-init /app/datadog-init RUN pip install --target /dd_tracer/python/ ddtrace ENV DD_SERVICE=datadog-demo-run-python ENV DD_ENV=datadog-demo ENV DD_VERSION=1 ENTRYPOINT ["/app/datadog-init"] CMD ["/dd_tracer/python/bin/ddtrace-run", "python", "app.py"]
ところで、Azure App Serviceにはアプリの実行環境にsshする機能が存在します。 コードデプロイの環境の場合は特に問題ありませんが、カスタムコンテナ環境の場合はAzureのドキュメントに従ってssh serviceを設定しなければいけません。
下記のドキュメントで案内されている方法が、entrypoint.shでserviceの開始とアプリの起動を行う手法です。
DatadogとAzure App Serviceのsshを同時に利用する場合、ENTRYPOINTをどのように設定すれば良いでしょうか?
解決法
Datadogのドキュメントを読むと、datadog-initの引数としてはddtrace-run、ddtrace-runの引数としてアプリのコマンド(今回はPython)を設定すれば良いようでした。
DockerfileのENTRYPOINTとCMDはコンテナ起動時に以下のように実行されます。
ENTRYPOINT ["コマンド"] CMD ["引数1", "引数2", …]
上記を利用してentrypoint.shでCMDの値を受けるように変更を行い、動作させることができました。 2025/02/27現在動作した設定は以下となります。
Dockerfile
FROM python:3.12 WORKDIR /workdir # Start and enable SSH RUN apt-get update \ && apt-get install -y --no-install-recommends dialog \ && apt-get install -y --no-install-recommends openssh-server \ && echo "root:Docker!" | chpasswd RUN mkdir -p /etc/startup COPY sshd_config /etc/ssh/ # datadog COPY --from=datadog/serverless-init:1 /datadog-init /datadog/datadog-init RUN pip install --target /dd_tracer/python/ ddtrace COPY requirements.txt . RUN pip install -U pip RUN pip \ --trusted-host pypi.python.org \ --trusted-host files.pythonhosted.org \ --trusted-host pypi.org \ --default-timeout=1000 \ install -r /workdir/requirements.txt # copy ssh entry point COPY entrypoint.sh /etc/startup RUN chmod u+x /etc/startup/entrypoint.sh EXPOSE 8080 2222 COPY ./*.py /workdir/ # datadog and ssh setting ENTRYPOINT ["/etc/startup/entrypoint.sh"] # entrypoint.sh内でsshdとdatadog-initを起動 CMD ["gunicorn","--bind", "0.0.0.0:8080", "--worker-class", "aiohttp.worker.GunicornWebWorker", "--timeout", "600", "app:APP"]
entrypoint.sh
#!/bin/sh set -e service ssh start echo "entrypoint args" echo $@ # entrypoint.shの引数 == DockerfileのCMD /datadog/datadog-init /dd_tracer/python/bin/ddtrace-run $@
Pythonでの例として、以下のようなaiohttp製アプリの出力をDatadogで確認してみます。
app.py
import sys import logging from aiohttp import web from aiohttp.web import json_response logging.basicConfig(stream=sys.stdout) # 標準出力に設定 logger = logging.getLogger("app") logger.setLevel("INFO") async def check(_): logger.info("datadogに出力されていますか?") return json_response( data={"message": "test response"}, status=200) APP = web.Application() APP.router.add_get("/api/check", check) if __name__ == "__main__": web.run_app(APP, host="0.0.0.0", port=8080)
環境変数は以下のようにApp Serviceから設定します。
すると、無事にApp ServiceからDatadogにログ送信できたようです。
なお、sshも有効になっていました。
コンテナでの開発時には、--entrypoint ""
と指定することでentrypoint.shを利用しないこともできます。
docker run -it --entrypoint "" --rm -p xxxx:8080 -v `pwd`:/workdir xxxx bash
おわりに
今回は小ネタでしたが、Azure App ServiceのLinux ContainerをDatadogと連携する方法を紹介しました。
DatadogとAzureの連携には他にも様々な機能があるようですので、面白いものがありましたらあらためて共有させていただきます。