[Docker/Python]Could not open requirements file: [Errno 2] No such file or directory: でDocker buildに失敗したときの対処法

はじめに

Dockerコンテナビルド時に、Pythonの各種ライブラリのインストールを、requirements.txtに書き出したものをインストールするようにしたところ、少しハマったのでメモします。

結論から言うと、requirements.txtをビルドしたコンテナ内にコピーした上で、pip installする必要がありました。

以下の順序であれば動きます。

# requirements.txtをコピー
COPY requirements.txt .

# pipアップグレード
RUN pip install --upgrade pip
RUN pip install --user -r requirements.txt

ディレクトリ構成

.
├── app
│   ├── Dockerfile
│   ├── requirements.txt
. .
├── docker-compose.yml
.

こんな感じの構成。
appはPython用のディレクトリで、requirements.txtには使うライブラリが記載されています。

docker-compose.yml

version: '3'
services:
(省略)
  appserver:
    build:
      context: ./app/

Dockerfile

# ベースイメージ作成
FROM python:3.7

# pipアップグレード
RUN pip install --upgrade pip
RUN pip install --user -r requirements.txt

# 作業ディレクトリ指定
WORKDIR /workdir

# 公開ポート指定
EXPOSE 8080

ビルドすると、失敗

$ docker-compose build

すると、以下のエラーが出ました。

ERROR: Could not open requirements file: [Errno 2] No such file or directory: 'app/requirements.txt'

調べてみると、ビルドした直後のコンテナにはディレクトリに配置しているrequirements.txtは含まれていないため、ファイルが無いよと言われていました。そりゃそうだ感…

修正版

# ベースイメージ作成
FROM python:3.7

# requirements.txtをコピー
COPY requirements.txt .

# pipアップグレード
RUN pip install --upgrade pip
RUN pip install --user -r requirements.txt

# 作業ディレクトリ指定
WORKDIR /workdir

# 公開ポート指定
EXPOSE 8080

修正した上で$ docker-compose buildすると、うまくいきました。

参考