M1 MacにApple Chip用のDocker Desktop on Macをインストールしてpythonの環境を建てて開発しようと思ったのですが、TA-Libがドキュメント通りにやってもインストールできませんでした。
しかし、NumPyやpandasは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ではplatform
をlinux/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.
コメント