🤖

Python/Ubuntu22.04/pyenv/fish環境をDockerで構築する方法

2023/05/29に公開

はじめに

前半は共通ですが、後半ではGPUなし、ありの2通りを書いてありますのでお手元の環境によって見る場所を変えてください。また、今回はUbuntu22.04上で動かしています。

1. Dockerをインストール

まずdockerをインストールします。

# 依存パッケージインストール
sudo apt update
sudo apt install \
  ca-certificates curl gnupg lsb-release

# Dockerの公式GPGキーを追加
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
  | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# Dockerリポジトリ登録
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" \
  | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Docker Engineのインストール
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io

dockerのインストールが成功したことを確認するには、以下を実行します。

docker -v

インストールに成功している場合、次のような出力が表示されます。

Output
Docker version 24.0.2, build cb74dfc

2. docker-composeをインストール

今回はdocker-composeを使いたいため、docker-composeもインストールします。

sudo curl -L "https://github.com/docker/compose/releases/download/1.26.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

docker-composeのインストールが成功したことを確認するには、以下を実行します。

docker-compose -v

インストールに成功している場合、次のような出力が表示されます。

Output
docker-compose version 1.26.0, build d4451659

テストのためにdocker上にコピーするファイルを作っておく

今回のdocker imageは/home/ubuntu(ホームディレクトリ)にDockerfile, docker-compose.yml, requirements.txtの3つのファイルを配置し、/home/ubuntu/aiディレクトリ内のファイルをdocker上の/appディレクトリ内にコピーする設定にしています。この機能の部分は適宜変更しても使用できます。

これはオプションですが、この記事ではdocker上に指定したディレクトリ配下がちゃんとコピーされているか確かめるために、test.txtというファイルを作ってみます。

cd ~/
mkdir ai
cd ai
touch text.txt

ファイル構造

上述通り、以下のようにdocker環境を構築しましょう。どのディレクトリ上でもかまいません。この記事では/home/ubuntu上に以下3つのファイルを置いています。

.
├── Dockerfile
├── docker-compose.yml
└── requirements.txt

10.1 【GPUなしの場合】

以下に、Python 3.10.7を用いたDockerとdocker-composeでの機械学習開発環境構築の手順を示します。

1. Dockerfile

まずはDockerfileを作成します。このDockerfileは、以下の機能を持たせたdocker imageを作ってくれます。

  • Ubuntu 22.04
  • Python 3.10.7
  • shellにfishを使用
# Use the official Ubuntu 22.04 image from the Docker Hub
FROM ubuntu:22.04

# Set the working directory inside the container
WORKDIR /app

# Set time zone
ENV TZ=Asia/Tokyo
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# Update the system and upgrade the packages
RUN apt-get update \
    && DEBIAN_FRONTEND=noninteractive apt-get upgrade -y \
    && DEBIAN_FRONTEND=noninteractive apt-get install -y tzdata \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

# Install the necessary packages
RUN apt-get update \
    && apt-get install -y \
    git \
    curl \
    wget \
    build-essential \
    zlib1g-dev \
    libncurses5-dev \
    libgdbm-dev \
    libbz2-dev \
    libnss3-dev \
    libsqlite3-dev \
    libssl-dev \
    liblzma-dev \
    libreadline-dev \
    libffi-dev \
    libgl1-mesa-dev \
    locales \
    fish \
    vim \
    iputils-ping \
    net-tools \
    software-properties-common \
    fonts-powerline

# Install fisher and set fish as the default shell
RUN chsh -s /usr/bin/fish
RUN fish -c "curl -sL https://git.io/fisher | source ; fisher install jorgebucaran/fisher"
RUN fish -c "fisher install oh-my-fish/theme-bobthefish"

# Install pyenv
RUN git clone https://github.com/pyenv/pyenv.git ~/.pyenv

# Add pyenv settings to fish config
RUN mkdir -p ~/.config/fish
RUN echo 'set -x PYENV_ROOT $HOME/.pyenv' >> ~/.config/fish/config.fish
RUN echo 'set -x PATH  $PYENV_ROOT/bin $PATH' >> ~/.config/fish/config.fish
RUN echo 'set -x PATH $PYENV_ROOT/shims $PATH' >> ~/.config/fish/config.fish
RUN echo 'status --is-interactive; and source (pyenv init -|psub)' >> ~/.config/fish/config.fish

# Add pyenv settings to bashrc
RUN echo '' >> ~/.bashrc
RUN echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
RUN echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
RUN echo 'eval "$(pyenv init --path)"' >> ~/.bashrc

# Download and install Python 3.10.7
RUN fish -c "pyenv install 3.10.7"
RUN fish -c "pyenv global 3.10.7"

# Set environment variables
ENV PYENV_ROOT=/root/.pyenv
ENV PATH=$PYENV_ROOT/bin:$PATH

# Configure locale
RUN locale-gen en_US.UTF-8
ENV LC_ALL=en_US.UTF-8
ENV LANG=en_US.UTF-8
ENV LANGUAGE=en_US.UTF-8

# Install any needed packages specified in requirements.txt
COPY ./requirements.txt /app/requirements.txt
RUN fish -c  "pip install --upgrade pip"
RUN fish -c "pip install --no-cache-dir -r requirements.txt"

# This environment variable ensures that the python output is set straight
# to the terminal without buffering it first
ENV PYTHONUNBUFFERED True

2. docker-compose.yml

次に、docker-composeの設定ファイルdocker-compose.ymlを作成します。このファイルは、Dockerコンテナの起動と管理を簡易化するための設定を記述したものです。

# docker-compose.yml
version: '3'

services:
  ai_dev:
    build:
      context: .
      dockerfile: Dockerfile_v4
    volumes:
      - /home/ubuntu/ai:/app
    tty: true
    command: python3

3. コンテナを作成

以下のコマンドを実行して、docker-composeを用いてコンテナを作成します。

sudo docker-compose up -d

このコマンド実行には5分以上かかるかもしれません。

これで、Python 3.10.7の上に機械学習開発環境が構築され、/home/ubuntu/ai ディレクトリがコンテナ内の /app ディレクトリと同期されます。

なお、docker-composeコマンドを実行するためには、Dockerfileとdocker-compose.ymlが同じディレクトリに存在し、そのディレクトリ上でコマンドを実行する必要があります。また、上記の設定ではコンテナ内でPythonインタプリタが実行されますが、別のコマンドを実行する場合は、command: に続く行を適宜書き換えてください。

4. docker-composeが成功したかどうか確認

作成したdocker containerを確認しましょう。

sudo docker container ls -a

以下のような出力がされたら成功です。

Output
CONTAINER ID   IMAGE           COMMAND     CREATED         STATUS         PORTS     NAMES
d45f5c4a2090   ubuntu_ai_dev   "python3"   8 seconds ago   Up 7 seconds             ubuntu_ai_dev_1

docker imageも同時に作成されているはずなので見てみましょう。docker imageはダウンロードに時間がかかるので、できれば削除したくないところです。

sudo docker images

以下のように出力されれば成功です。

Output
REPOSITORY      TAG       IMAGE ID       CREATED          SIZE
ubuntu_ai_dev   latest    b5ffa845b803   12 minutes ago   1.21GB
ubuntu          22.04     3b418d7b466a   4 weeks ago      77.8MB

5. dockerに入る

では、作成したdockerに入りましょう。先ほど

sudo docker container ls -a

で得られた出力の中のCONTAINER IDをコピーして以下のコマンドを実行します。

sudo docker exec -it d45f5c4a2090 fish

これで

のように表示されていれば成功です!

10.2 【GPUありの場合】nvidia driver, nvidia dockerを準備して機械学習実行環境を構築

[これから書きます!]

docker-composeの削除方法

以下はdocker-compose up -dで作成したコンテナ、イメージ、ボリューム、ネットワークそして未定義コンテナ、全てを一括消去するコマンドです。

sudo docker-compose down --rmi all --volumes --remove-orphans

Discussion