Azure App ServiceにSSH接続したい
前提
・コンテナー化されたWebアプリをApp Serviceにデプロイ中
・アプリはFastAPI製
・Container管理にAzure Container Registryを使用
ドキュメント通り進める
以下の公式ドキュメントをもとにDockerfileに追記してカスタムコンテナを構成していきます。
1. SSHを有効にする
sshd_config
ファイルをルートディレクトリに作成
Port 2222
ListenAddress 0.0.0.0
LoginGraceTime 180
X11Forwarding yes
Ciphers aes128-cbc,3des-cbc,aes256-cbc,aes128-ctr,aes192-ctr,aes256-ctr
MACs hmac-sha1,hmac-sha1-96
StrictModes yes
SyslogFacility DAEMON
PasswordAuthentication yes
PermitEmptyPasswords no
PermitRootLogin yes
Subsystem sftp internal-sftp
2. エントリーポイントスクリプトを作成
アプリケーション起動コマンドとSSH接続開始コマンドを記載したファイルをルートディレクトリに作成します。
#!/bin/sh
set -e
service ssh start
exec gunicorn app:app
3. Dockerfileを作成
最後にDockerfileを作成します。
既にあるので、既存のファイルに追記していきます。
FROM python:3.9
WORKDIR /code
COPY entrypoint.sh .
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 \
&& chmod u+x ./entrypoint.sh
COPY sshd_config /etc/ssh/
EXPOSE 3100 2222
ENTRYPOINT [ "./entrypoint.sh" ]
4. デプロイ
Azure DevopsのPipelineを使ってデプロイしているので追加分をPushしてPipelineを実行
エラーが出た
デプロイしてみたところ503エラーになりました。
ログストリームを確認したところ以下のエラー文が出てました。必要なフォルダがないようです。
「ERROR]cp: target /etc/pki/ca-trust/source/anchors' is not a directory
解決
エラー文通り、/etc/pki/ca-trust/source/anchorsフォルダを作成するコマンドを追加します。
FROM python:3.9
WORKDIR /code
COPY entrypoint.sh .
// 追加
RUN mkdir -p /etc/pki/ca-trust/source/anchors
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 \
&& chmod u+x ./entrypoint.sh
COPY sshd_config /etc/ssh/
EXPOSE 3100 2222
ENTRYPOINT [ "./entrypoint.sh" ]
再度デプロイします。
また別のエラーが出た
次はentrypoint.shへの実行権限がないとのこと。
ERROR - Container start failed for <resource name> 1 2262eac2 with system. AggregateException, One or more errors occurred. (Docker API responded with status code=BadRequest, response=("message": "failed to create shim task: OCI runtime create failed: run create failed: unable to start container process: exec: |". /entrypoint.shl": permission ¡denied: unknown"}) InnerException: Docker. DotNet. DockerApiException, Docker API responded with status code=BadRequest, response= "message": "failed to create shim task: OCI runtime create failed: run create failed: unable to start container process: exec: \"./entrypoint.sh\": permission denied: unknown"}
権限をつけるコマンドは入れているから、ファイルに参照できてないのかもしれない。
いろいろ調べてみたところ、どうやら相対パスなのが良くないらしい
解決
相対パスから絶対パスに変更します。
FROM python:3.9
WORKDIR /code
// 絶対パスに変更
COPY entrypoint.sh /
RUN mkdir -p /etc/pki/ca-trust/source/anchors
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 \
&& chmod u+x /entrypoint.sh
COPY sshd_config /etc/ssh/
EXPOSE 3100 2222
// 絶対パスに変更
ENTRYPOINT [ "/entrypoint.sh" ]
再度デプロイ
検証
SSH接続できました。
Discussion