日々精進

新しく学んだことを書き留めていきます

dockerコンテナ起動時にsshdを起動し、sshでログイン出来るようにする

以下のようにDockerfileを作る。これはPythonサーバと機械学習モデルを動かすコンテナなのでそのへんの設定も色々入っているが。。

# ベースイメージ
FROM centos:7.6.1810

# pipを実行出来るようにするため、/opt/conda/binにpathを通す
ENV PATH /opt/conda/bin:$PATH
# /root/.local/binにパスが通っていないとライブラリのインストール中に警告メッセージが表示されるためPATHを通す。
ENV PATH /root/.local/bin:$PATH

## yumインストール
RUN yum -y update \
   && yum -y install bzip2 ca-certificates curl git initscripts \
   lsof libSM.x86_64 libXext.x86_64 libXrender.x86_64 mesa-libGL.x86_64 nano openssh-server sudo tcpdump wget

# 開発用ユーザ作成
RUN useradd -ms /bin/bash dev-user
# パスワードをdevに設定
RUN echo 'dev-user:dev' | chpasswd
RUN echo "dev-user    ALL=(ALL)       ALL" >> /etc/sudoers

# Minicondaインストール
RUN wget --quiet https://repo.anaconda.com/miniconda/Miniconda3-4.5.12-Linux-x86_64.sh -O /home/dev-user/miniconda.sh \
   && /bin/bash /home/dev-user/miniconda.sh -b -p /opt/conda \
   && rm /home/dev-user/miniconda.sh \
   && /opt/conda/bin/conda clean -tipsy \
   && ln -s /opt/conda/etc/profile.d/conda.sh /etc/profile.d/conda.sh \
   && echo ". /opt/conda/etc/profile.d/conda.sh" >> /home/dev-user/.bashrc \
   && echo 'export PYTHONPATH="/home/dev-user/workspace/server"' >> /home/dev-user/.bashrc

# SSH起動準備
RUN /usr/sbin/sshd-keygen -A

# コンテナにログインする際に使用するauthorized_keysをコピー
COPY ./authorized_keys /home/dev-user/.ssh/authorized_keys
RUN chmod 700 /home/dev-user/.ssh
RUN chmod 600 /home/dev-user/.ssh/authorized_keys
RUN sed -ie 's/#PubkeyAuthentication yes/PubkeyAuthentication yes/g' /etc/ssh/sshd_config

# ディレクトリコピー
COPY ./server /home/dev-user/workspace/server

# 実行時にエラーにならないよう、改行コードを変換する。実行権限を追加する。
RUN sed -i -e 's/\r//g' /home/dev-user/workspace/server/flask_run
RUN chmod 766 /home/dev-user/workspace/server/flask_run

# pip, condaインストール
RUN su dev-user \
    && source /home/dev-user/.bashrc \
    && pip install --upgrade pip \
    && conda update -n base -c defaults conda \
    # awscliとboto3が無いとconda env createを実行した時にエラーが発生する(S3を自社のcondaパッケージリポジトリにしているので)ため、requirements.yamlを使わず個別にインストールする
    && pip install awscli --upgrade --user \
    && conda install boto3 \
    # publicパッケージインストール
    && cd /home/dev-user/workspace/server \
    && conda env create -f requirements.yaml \
    && conda activate p36 \
    && exit

# p36環境を作成した後で.bashrcに以下のコマンドを追加すること。作成前だとp36環境がないためユーザをdev-userに切り替えた時にエラーになる
RUN echo "conda activate p36" >> /home/dev-user/.bashrc

# tensorboard用ポート
EXPOSE 6006
# SSH用ポート
EXPOSE 22
# MLサービス用ポート
EXPOSE 3333

# /optのownerがrootになっているとパッケージをインストールできないのでownerを変更する
RUN chown dev-user:dev-user /opt -R

# build中に作成・コピーされたファイルはownerがrootになっているのでdev-userに変更
RUN chown dev-user:dev-user /home/dev-user -R

# runコマンドに-dオプションをつけてコンテナを起動したままにする想定のためここでは起動スクリプトを実行するのみとする
CMD ["/usr/sbin/sshd", "-D"]

コンテナ起動時のコマンドは以下。-dオプションがないと起動してすぐにStopしてしまうので注意。

docker run -itd --rm -p 2222:22 -p 6006:6006 -p 3333:3333 -v /home/ec2-user/workspace:/workspace --name my-service my-service:001