
テックラボの高橋です。今回は小ネタです。

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の連携には他にも様々な機能があるようですので、面白いものがありましたらあらためて共有させていただきます。