これはなに
Ubuntu 18.04 + Python 3.7の環境を作らなければならなかったときに、Dockerで環境を構築したときの備忘録。
最終的なDockerfile
先に結論を示す。以下のDockerfileをビルドすれば、Ubuntu 18.04 + Python 3.7の環境を構築できる。Ubuntuのバージョンを変えたい場合は、FROM ubuntu:18.04
をUbuntu Official Image
にある任意のバージョンのタグに変更する。Pythonのバージョンを変えたい場合は、ARG python_version="3.7.16"
を、Pythonのソースコード置き場
にある任意のバージョンに変更する。
FROM ubuntu:18.04
ARG python_version="3.7.16"
# Set locale
RUN apt update -y \
&& apt install -y --no-install-recommends \
language-pack-en
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8
RUN ln -snf /usr/share/zoneinfo/America/New_York /etc/localtime
RUN apt update -y \
&& apt install -y --no-install-recommends \
tzdata
# Install packages
# Ref: https://github.com/pyenv/pyenv/wiki#suggested-build-environment
RUN apt update -y \
&& apt install -y --no-install-recommends \
git \
wget \
xz-utils \
build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev curl \
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev \
libgdbm-dev libdb-dev uuid-dev
# Install Python
RUN cd /usr/local/src \
&& wget --no-check-certificate https://www.python.org/ftp/python/${python_version}/Python-${python_version}.tar.xz \
&& tar -Jxvf Python-${python_version}.tar.xz \
&& cd Python-${python_version} \
&& ./configure --with-ensurepip \
&& make \
&& make install
# Set alias
RUN echo 'alias python=python3' >> ~/.bashrc
RUN echo 'alias pip=pip3' >> ~/.bashrc
RUN . ~/.bashrc
RUN apt autoremove -y
Dockerfileの説明
Dockerfileでやっていることを説明する。
localeとタイムゾーンを設定する
最初にlocaleとタイムゾーンを設定している。この設定は任意だが、設定しておかないと後々面倒になる(と個人的に思っている)ので設定している。
# Set locale
RUN apt update -y \
&& apt install -y --no-install-recommends \
language-pack-en
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8
RUN ln -snf /usr/share/zoneinfo/America/New_York /etc/localtime
RUN apt update -y \
&& apt install -y --no-install-recommends \
tzdata
日本語かつ日本時間に設定する場合は、以下のようになる。
# Set locale
RUN apt update -y \
&& apt install -y --no-install-recommends \
language-pack-ja-base
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
RUN ln -snf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
RUN apt update -y \
&& apt install -y --no-install-recommends \
tzdata
ちなみに、localeだけ設定してタイムゾーンを設定しないと、docker build
がタイムゾーンの入力で止まってしまうので注意。
Ubuntuに任意のバージョンのPythonをインストールする
apt upgrade
やapt install python3
だと、任意バージョンのPythonや最新バージョンのPythonをインストールできない。よって、今回はPythonのソースコードをビルドしてインストールしている。
ソースコードのビルドに必要なパッケージをインストールする
Pythonのソースコードをビルドするのに必要なパッケージをインストールする。 今回は、pyenvが推奨するビルド環境 を参考にパッケージをインストールしている。
# Install packages
# Ref: https://github.com/pyenv/pyenv/wiki#suggested-build-environment
RUN apt update -y \
&& apt install -y --no-install-recommends \
git \
wget \
build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev curl \
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev \
libgdbm-dev libdb-dev uuid-dev
ソースコードをダウンロードする
以下の部分でPythonのソースコードをダウンロードしている。
# Install Python
RUN cd /usr/local/src \
&& wget --no-check-certificate https://www.python.org/ftp/python/${python_version}/Python-${python_version}.tar.xz \
&& tar -Jxvf Python-${python_version}.tar.xz \
&& cd Python-${python_version} \
&& ./configure --with-ensurepip \
&& make \
&& make install
特定のバージョンのPythonのソースコードは、https://www.python.org/ftp/python/
から入手できる。
たとえば、Python 3.7.16なら、https://www.python.org/ftp/python/3.7.16/
からダウンロードできる。今回はPython-3.7.16.tar.xz
をダウンロードしている。
wget --no-check-certificate https://www.python.org/ftp/python/3.7.16/Python-3.7.16.tar.xz
ダウンロードしたらtar
コマンドで解凍する。
tar -Jxvf Python-3.7.16.tar.xz
ソースコードをビルドする
以下の部分で、ダウンロードしたPythonのソースコードをビルドしている。
# Install Python
RUN cd /usr/local/src \
&& wget --no-check-certificate https://www.python.org/ftp/python/${python_version}/Python-${python_version}.tar.xz \
&& tar -Jxvf Python-${python_version}.tar.xz \
&& cd Python-${python_version} \
&& ./configure --with-ensurepip \
&& make \
&& make install
まず、configure
を実行する。これにより、設定に応じたMakefile
が生成される。
configure
を実行する際にはオプションを指定できる。
オプションは以下のコマンドで確認できる。
./configure --help
今回は--with-ensurepip
というオプションを指定している。これによりビルド時にpipを有効化できる。
Makefile
ができたら、make
コマンドでソースコードをビルドし、make install
コマンドでコンパイルする。
エイリアスを設定する
この設定は任意。python
コマンドでpython3
を実行するように指定している。また、pip
コマンドでpip3
を実行するように指定している。
# Set alias
RUN echo 'alias python=python3' >> ~/.bashrc
RUN echo 'alias pip=pip3' >> ~/.bashrc
RUN . ~/.bashrc