M1 Mac のdockerでTA-Libがインストールできない

M1 MacにApple Chip用のDocker Desktop on Macをインストールしてpythonの環境を建てて開発しようと思ったのですが、TA-Libがドキュメント通りにやってもインストールできませんでした。

しかし、NumPypandasはpipでインストールできました。

ローカルとdockerは次のような環境です。

  • macOS Monterey (M1)
  • Docker Desktop for Mac 4.8.2

開発環境ではdockerで構築しますが、dockerでの開発環境を構築に不安がある人は次の書籍が良書なので、この書籍でdockerを学習することをオススメします。

python開発環境を作るdockerfileは以下の通りです。

# pythonの3.8.0をベースにする
FROM python:3.8.0

RUN apt-get update \
    && apt-get upgrade -y \
    # imageのサイズを小さくするためにキャッシュ削除
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* \
    # pipのアップデート
    && pip install --upgrade pip

# 作業するディレクトリを変更
WORKDIR /home

COPY requirements.txt ${PWD}

# pythonのパッケージをインストール
RUN pip install -r requirements.txt

# 作業するディレクトリを変更
# コンテナの内部には入った際のディレクトリの位置を変更している
WORKDIR /home/src

以下のようにdocker-composeを使ってビルドしています。

version: "3"
services:
  app:
    container_name: "python_container"
    build:
      context: .
      dockerfile: ./Dockerfile
    image: python_container
    volumes:
      - $PWD:/home/src
    tty: true

TA-Libをインストールしようとしても以下のようになってインストールできない。

$ pip install TA-Lib
Collecting TA-Lib
  Downloading TA-Lib-0.4.24.tar.gz (269 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 269.4/269.4 kB 4.4 MB/s eta 0:00:00
  Preparing metadata (setup.py) ... done
Requirement already satisfied: numpy in /usr/local/lib/python3.8/site-packages (from TA-Lib) (1.22.3)
Building wheels for collected packages: TA-Lib
  Building wheel for TA-Lib (setup.py) ... error
  error: subprocess-exited-with-error
  
  × python setup.py bdist_wheel did not run successfully.
  │ exit code: 1
  ╰─> [28 lines of output]
...
      creating build/temp.linux-aarch64-3.8/talib
      gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/usr/include -I/usr/local/include -I/opt/include -I/opt/local/include -I/opt/homebrew/include -I/opt/homebrew/opt/ta-lib/include -I/include -I/usr/local/lib/python3.8/site-packages/numpy/core/include -I/usr/local/include/python3.8 -c talib/_ta_lib.c -o build/temp.linux-aarch64-3.8/talib/_ta_lib.o
      talib/_ta_lib.c:682:10: fatal error: ta-lib/ta_defs.h: No such file or directory
       #include "ta-lib/ta_defs.h"
                ^~~~~~~~~~~~~~~~~~
      compilation terminated.
      error: command 'gcc' failed with exit status 1
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
error: legacy-install-failure

× Encountered error while trying to install package.
╰─> TA-Lib

note: This is an issue with the package mentioned above, not pip.
hint: See above for output from the failure.
WARNING: There was an error checking the latest version of pip.
目次

解決方法

解決方法はdocker-compose.ymlでplatformを指定することです。

以下のdocker-compose.ymlではplatformlinux/amd64に指定しています。

version: "3"
services:
  app:
    container_name: "python_container"
    platform: linux/amd64
    build:
      context: .
      dockerfile: ./Dockerfile
    image: python_container
    volumes:
      - $PWD:/home/src
    tty: true

原因

TA-Libがインストールできなかった原因は、TA-LibがM1チップに対応していないからです。

linux/amd64のようにintelチップ用のイメージでコンテナを作る必要がありました。

M1チップでもインテルチップ(x86_64)向けイメージも動くのでamd64を使います。

Githubの「Symbol not found: _TA_ACOS error」でもたくさんの方が困っていました。

なぜarm(M1チップ)用のイメージがpullされたのかというと、platformでCPUアーキテクチャーを指定しないと自動でマシンに合ったイメージをpullするからです。

そのため、ローカルマシンはM1 Macなので、立ち上がったコンテナのCPUアーキテクチャはarmでした。
PCのCPUアーキテクチャを調べるコマンドは次のとおりです。

$ uname -m
arm64 # ローカルマシンCPUアーキテクチャ- → ARM
$ docker-compose up -d
$ docker exec -it python_container /bin/bash
$ uname -m
aarch64 # コンテナCPUアーキテクチャ- → ARM

ここらへんの知識をしっかり身につけたい場合は、「M1 Mac で Docker を動かすための知識とノウハウ」が参考になります。

試したこと

TA-Libをインストールすために試したことをご紹介します。
しかし、全部インストールできませんでした。

dockerfile内でTA-Libをインストール

次のようにdockerfile内でTA-Libをインストールしようと試みました。

# pythonの3.8.0をベースにする
FROM python:3.8.0

...

RUN wget http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz && \
  tar -xvzf ta-lib-0.4.0-src.tar.gz && \
  cd ta-lib/ && \
  ./configure --prefix=/usr && \
  make && \
  make install
RUN pip install TA-Lib
RUN rm -R ta-lib ta-lib-0.4.0-src.tar.gz

# 作業するディレクトリを変更
# コンテナの内部には入った際のディレクトリの位置を変更している
WORKDIR /home/src
version: "3"
services:
  app:
    container_name: "python_container"
    build:
      context: .
      dockerfile: ./Dockerfile
    image: python_container
    volumes:
      - $PWD:/home/src
    tty: true

CPUアーキテクチャーがarmだったため、コンテナを作ることができませんでした。

 $ docker-compose up -d   
...
> [6/9] RUN wget http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz &&   tar -xvzf ta-lib-0.4.0-src.tar.gz &&   cd ta-lib/ &&   ./configure --prefix=/usr &&   make &&   make install:                                                                                                    
#0 0.266 --2022-05-27 03:21:21--  http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz                                                  
#0 0.266 Resolving prdownloads.sourceforge.net (prdownloads.sourceforge.net)... 204.68.111.105
...
#0 3.121 UNAME_MACHINE = aarch64
#0 3.121 UNAME_RELEASE = 5.10.104-linuxkit
#0 3.121 UNAME_SYSTEM  = Linux
#0 3.121 UNAME_VERSION = #1 SMP PREEMPT Thu Mar 17 17:05:54 UTC 2022
#0 3.123 configure: error: cannot guess build type; you must specify one
------
failed to solve: executor failed running [/bin/sh -c wget http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz &&   tar -xvzf ta-lib-0.4.0-src.tar.gz &&   cd ta-lib/ &&   ./configure --prefix=/usr &&   make &&   make install]: exit code: 1

anacondaでTA-Libをインストール

イメージをanacondaに変更。condaパッケージを利用してTA-Libのインストールを試みました。

# anacondaをベースにする
FROM continuumio/anaconda3
...

# 作業するディレクトリを変更
# コンテナの内部には入った際のディレクトリの位置を変更している
WORKDIR /home/src
version: "3"
services:
  app:
    container_name: "python_container"
    build:
      context: .
      dockerfile: ./Dockerfile
    image: python_container
    volumes:
      - $PWD:/home/src
    tty: true

condaを使ってTA-Libをインストールしようとしましたが、インストールできませんでした。

$ docker-compose up -d
$ docker exec -it python_container /bin/bash
$ conda install -c conda-forge ta-lib
Collecting package metadata (current_repodata.json): done
Solving environment: failed with initial frozen solve. Retrying with flexible solve.
Collecting package metadata (repodata.json): done
Solving environment: failed with initial frozen solve. Retrying with flexible solve.

PackagesNotFoundError: The following packages are not available from current channels:

  - ta-lib

Current channels:

  - https://conda.anaconda.org/conda-forge/linux-aarch64
  - https://conda.anaconda.org/conda-forge/noarch
  - https://repo.anaconda.com/pkgs/main/linux-aarch64
  - https://repo.anaconda.com/pkgs/main/noarch
  - https://repo.anaconda.com/pkgs/r/linux-aarch64
  - https://repo.anaconda.com/pkgs/r/noarch

To search for alternate channels that may provide the conda package you're
looking for, navigate to

    https://anaconda.org

and use the search bar at the top of the page.
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次