下記のDockerfileでイメージを作ると、コンテナを作る時にSSH公開鍵を変数として渡すことができます。
FROM ubuntu:16.04
RUN apt-get update && apt-get install -y openssh-server openssh-client && \
apt-get clean && mkdir /var/run/sshd
RUN mkdir -p /root/.ssh && chmod 700 /root/.ssh && \
echo "echo \$AUTHORIZED_KEYS > /root/.ssh/authorized_keys" > /run.sh && \
echo "chmod 600 /root/.ssh/authorized_keys" >> /run.sh && \
echo "/usr/sbin/sshd -D" >> /run.sh
EXPOSE 22
CMD ["/bin/bash", "/run.sh"]
まずはこのDockerfileで、例えばubuntu1604ssh
という名前のイメージをビルドします:
$ docker build -t ubuntu1604ssh .
このイメージに対して-e AUTHORIZED_KEYS="$(cat ~/.ssh/id_rsa.pub)"
というオプションをつけて公開鍵を指定すると、SSH鍵認証が可能になります。コマンドは下記のようになります:
$ docker run -p 2233:22 --name=cn01 -e AUTHORIZED_KEYS="$(cat ~/.ssh/id_rsa.pub)" -dt ubuntu1604ssh
sshのコマンドはこんな感じです:
$ ssh -p 2233 -l root localhost
何度か繰り返す際にStrictHostKeyCheckingでエラーになってしまう場合は、下記のようにStrictHostKeyCheckingを無効にするという手もあります。(* セキュリティー・リスクがありますので自己責任で。)
$ ssh -o StrictHostKeyChecking=no -o LogLevel=FATAL -p 2233 -l root localhost
Dockerfile内で重要なのは下記の部分です。この部分を理解してしまえばどのディストリビューションにも適用できます。
RUN mkdir -p /root/.ssh && chmod 700 /root/.ssh && \
echo "echo \$AUTHORIZED_KEYS > /root/.ssh/authorized_keys" > /run.sh && \
echo "chmod 600 /root/.ssh/authorized_keys" >> /run.sh && \
echo "/usr/sbin/sshd -D" >> /run.sh
一応、主要なディストリビューションは一通り作ってしまったので他のディストリビューションでこの方法を試したい方は下記のレポジトリを覗いてみてください。