Python/Ubuntu22.04/pyenv/fish環境をDockerで構築する方法
はじめに
前半は共通ですが、後半では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