anfangd's blog

as a software engineer

Python - AmazonLinux2 に Python3.8 と Poetry をインストールした Dockerイメージを作成する

概要

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 を使用したアプリケーション開発を実現することが出来る。

課題

  • Python の仮想環境の考え方をうまく理解できていない。
  • Python の依存管理ツールの考え方をうまく理解できていない。

参考文献