概要
Python で Webアプリケーションを作りたくなった為、 Docker を使用してローカル開発環境を構築するための Dockerfile を作成した。この Dockerfile によって、以下の構成のイメージ・コンテナを作成することができた。
| Item | Content |
|---|---|
| OS | amazonlinux:2 |
| Python | 3.8.2 |
| Pip | pip3.8 |
| Poetry | 1.0.5 |
| OpenSSH | OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017 |
| Git | 2.23.3 |
もくじ
はじめに
とある方面から Python 関連の技術的な質問を頂くことになりそうになったが、 Python についてはほとんど触ってこなかったため、最低限の実行環境を整備しておくくらいはしておこうと思い調査した。
方法
Qiita や Stack Overflow を中心とした技術系ブログを参考に、Dockerfile 及び関連操作について調査し、まとめた。
結果
作成したコードの clone
次のコマンドでコードを GitHub から clone する。
git clone https://github.com/anfangd/dockerfile-AmazonLinux2-python3.8-poetry.git # Folder Structure tree . ├── Dockerfile └── authorized_keys
なお、 Docker のインストールは事前に済んでいることを前提とする。
事前準備
起動したコンテナ内に SSH 接続をしたため、事前に以下のような手順で秘密鍵と公開鍵を作成しておく。
# Create keys ssh-keygen -t rsa -b 4096 -C "hoge@example.com" -f ~/.ssh/id_rsa Generating public/private rsa key pair. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in id_rsa. Your public key has been saved in id_rsa.pub. ls ~/.ssh id_rsa id_rsa.pub # Dockerfile と同階層に公開鍵を配置する。 cp ~/.ssh/id_rsa.pub <PROJECT_ROOT>/authorized_keys
Build
次のコマンドで、 Docker の新しいイメージをビルドする。
# Build docker build -t "amazon-linux2/python" .
Start Container
次のコマンドで、新しく作成したイメージを起動する。
# Start Container docker run --privileged --rm -d -p 10000:22 --name amazonlinux2-sshd-container amazon-linux2/python /sbin/init
SSH Access to Container
次のコマンドで、起動したコンテナに SSH アクセスする。
# SSH Access ssh ec2-user@localhost -p 10000 -i ~/.ssh/private_key
Stop Container
作業が終わったら、次のコマンドでコンテナを停止させる。
# Stop Container docker stop amazonlinux2-sshd-container
Example: Poetry install Django | Flask
作成したコンテナ内では、 Poetry を使用することが出来る。
例えば、 Poetry を使用して Django をインストールする方法は次の通り。
# Example: Poetry install Django mkdir django-demo && cd $_ poetry init --no-interaction --dependency django poetry install poetry run django-admin.py startproject django-demo
また、 Poetry を使用して Flask をインストールする方法は次の通り。
# Example: Poetry install Flask mkdir flask-demo && cd $_ poetry init --no-interaction --dependency flask poetry install
Dockerfile
なお、 anfangd/dockerfile-AmazonLinux2-python3.8-poetry で取得する Dockerfile の中身は次の通り。
FROM amazonlinux:2
# 各環境変数を設定
ENV USER ec2-user
ENV HOME /home/${USER}
RUN echo "now building..."
# Install General Tools
RUN yum update -y \
&& yum install -y git wget tar make \
gcc openssl-devel bzip2-devel libffi-devel
# Install Python 3.8 && Poetry
RUN cd /opt \
&& wget https://www.python.org/ftp/python/3.8.2/Python-3.8.2.tgz \
&& tar xzf Python-3.8.2.tgz \
&& cd Python-3.8.2 \
&& ./configure --enable-optimizations \
&& make altinstall \
&& rm -f /opt/Python-3.8.2.tgz \
&& python3.8 --version \
&& pip3.8 --version
# 手元の公開鍵をコピー
COPY authorized_keys /tmp/id_rsa.pub
# Install SSH Server && Create and setting ec2-user.
RUN yum -y install \
sudo \
openssh-server \
openssh-clients \
which && \
yum clean all && \
systemctl enable sshd.service && \
echo "PasswordAuthentication no" >> /etc/ssh/sshd_config && \
useradd ${USER} && \
echo "ec2-user ALL=NOPASSWD: ALL" >> /etc/sudoers && \
sudo -u ${USER} mkdir -p ${HOME}/.ssh && \
mv /tmp/id_rsa.pub ${HOME}/.ssh/ && \
chmod -R go-rwx ${HOME}/.ssh && \
cat ${HOME}/.ssh/id_rsa.pub >> ${HOME}/.ssh/authorized_keys
# USER ${USER}
WORKDIR ${HOME}
RUN sudo -u ${USER} curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python3.8 \
&& echo 'alias poetry="python3.8 $HOME/.poetry/bin/poetry"' >> /home/ec2-user/.bashrc
RUN echo "finished."
考察
2020年5月10日時点では、特に問題なく期待通りの環境を構築することができた。
結論
Docker の AmazonLinux2 イメージの上に、Python3.8 と Poetry をインストールし、 Web Application Framework を使用したアプリケーション開発を実現することが出来る。
課題
参考文献
- 【初心者向け】エイリアスの設定方法 - Qiita
- SSH接続エラー回避方法:.ssh/known_hostsから特定のホストを削除する/削除しないで対処する3つの方法 - Qiita
- Poetry documentation (日本語訳) -python - How to start a new Django project using poetry? - Stack Overflow
- Poetry 0.12.3 uses Python 2.7.10 despite specifying 3.7.0 · Issue #536 · python-poetry/poetry
- 論文の読み方 / How to survey - Speaker Deck