💨
AtCoder環境のDockerfile: PyPy(+CPython)編
さんざん擦られたお題ではありますが、ご参考まで。
前提の環境
- Windows
- WSL2
- VSCode
- Docker Desktop
dockerfile
ubuntuのイメージを下書きに、2023年の言語アップデート時の提案シート通りにinstall commandを置いていくだけ、のはずが、いざやってみると、2025年の現在ではライブラリ達のくだりでエラーを吐き続け、まともに焼き上がりませんでした。
結論としては、PyPyのイメージに、バージョン名を抜いたライブラリのpipインストールを並べて、その後、CPythonのインストールをしたらうまくいきましたよ、というだけの話です。(Dockerと関係なかったですね。)
Dockerfile
FROM pypy
RUN apt update && apt install -y gcc g++ gfortran libopenblas-dev liblapack-dev pkg-config libgeos-dev
# PyPy libraries
RUN pypy3 -m pip install numpy
RUN pypy3 -m pip install scipy
RUN pypy3 -m pip install networkx
RUN pypy3 -m pip install sympy
RUN pypy3 -m pip install sortedcontainers
RUN pypy3 -m pip install more-itertools
RUN pypy3 -m pip install shapely
RUN pypy3 -m pip install bitarray
RUN pypy3 -m pip install PuLP
RUN pypy3 -m pip install mpmath
RUN pypy3 -m pip install pandas
RUN pypy3 -m pip install z3-solver
RUN pypy3 -m pip install scikit-learn
RUN pypy3 -m pip install typing-extensions
RUN pypy3 -m pip install cppyy
RUN pypy3 -m pip install git+https://github.com/not522/ac-library-python
# CPyton
WORKDIR /tmp
ENV DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true
RUN apt install -y build-essential gdb lcov pkg-config \
libbz2-dev libffi-dev libgdbm-dev libgdbm-compat-dev liblzma-dev \
libncurses5-dev libreadline6-dev libsqlite3-dev libssl-dev \
lzma lzma-dev tk-dev uuid-dev zlib1g-dev git wget bzip2
RUN wget https://www.python.org/ftp/python/3.11.4/Python-3.11.4.tar.xz -O Python-3.11.4.tar.xz &&\
tar xf Python-3.11.4.tar.xz
WORKDIR /tmp/Python-3.11.4
RUN ./configure --enable-optimizations &&\
make &&\
make altinstall
WORKDIR /tmp
RUN python3.11 -m pip install numpy==1.24.1
RUN python3.11 -m pip install scipy==1.10.1
RUN python3.11 -m pip install networkx==3.0
RUN python3.11 -m pip install sympy==1.11.1
RUN python3.11 -m pip install sortedcontainers==2.4.0
RUN python3.11 -m pip install more-itertools==9.0.0
RUN python3.11 -m pip install shapely==2.0.0
RUN python3.11 -m pip install bitarray==2.6.2
RUN python3.11 -m pip install PuLP==2.7.0
RUN python3.11 -m pip install mpmath==1.2.1
RUN python3.11 -m pip install pandas==1.5.2
RUN python3.11 -m pip install z3-solver==4.12.1.0
RUN python3.11 -m pip install scikit-learn==1.2.0
RUN python3.11 -m pip install ortools==9.5.2237
RUN python3.11 -m pip install git+https://github.com/not522/ac-library-python
RUN python3.11 -m pip install torch==1.13.1
RUN python3.11 -m pip install polars==0.15.15
RUN python3.11 -m pip install lightgbm==3.3.1
RUN python3.11 -m pip install gmpy2==2.1.5
RUN python3.11 -m pip install numba==0.57.0
RUN python3.11 -m pip install -U setuptools==66.0.0
RUN python3.11 -m pip install cppyy==2.4.1
# online-judge-tools
RUN apt install -y python3-pip &&\
#pip3 install online-judge-tools
pip3 install git+https://github.com/sukenori/oj.git
# Docker
RUN apt install -y docker.io
正直、特段使うあてもないライブラリだったりもするので、素直にコメントアウトしてしまえばいいのですが、気分的にジャッジサーバーの設定にピタリと合わせたいじゃないですか。
同じ内容の他の記事を見るに、多分この当時はこれで問題なかったのでしょう。皆さんにとっては当たり前なのかもしれませんが、それから時が経って2024-2025言語アップデートの話も聞こえて来た昨今では、使用できる言語とライブラリの一覧通りにバージョン指定しても上手くいかなかったよ、さすがにCPythonは問題なかったけど、やはり、というか、PyPyは全くダメだったよ、というだけの話でした。
補足
- インストールには結構時間がかかります。ライブラリ毎にRUNで起こしてあるのは、当初うまくいかなかったときに、何とか1ステップずつでも確定させたかったからで、うまくいくとわかっている今となっては、もちろん、各pipを&&で結んだ方がいいでしょう。
- online-judge-toolsなんですが、こうして書いたDockerfileを使ったVSCodeのdevcontainer内でsubmitしても、結果表示のブラウザが立ち上がらなかったので、submit.pyのshow resultのところのutils.webbrowser_register_explorer_exe()の行をコメントアウトしただけです(決して怪しいものではこざいません)。
Discussion