[解決済み] Alpineにpsycopg2をDockerでインストールすると、エラー: pg_configの実行ファイルが見つからない
質問
DockerでPostgresを使用したFlaskアプリを構築しようとしています。PostgresのAWS RDSインスタンスに接続したいのですが、私のFlaskアプリにはDockerを使用します。しかし
psycopg2
をセットアップしようとすると、エラーになります。
pg_config
. 以下がそのエラーです。
Building api
Step 1/5 : FROM python:3.6.3-alpine3.6
---> 84c98ca3b5c5
Step 2/5 : WORKDIR /usr/src/app
---> Using cache
---> 407c158f5ee4
Step 3/5 : COPY . .
---> 966df18d329e
Step 4/5 : RUN pip install -r requirements.txt
---> Running in 284cc97aeb63
Collecting aniso8601==1.3.0 (from -r requirements.txt (line 1))
Downloading aniso8601-1.3.0.tar.gz (57kB)
Collecting click==6.7 (from -r requirements.txt (line 2))
Downloading click-6.7-py2.py3-none-any.whl (71kB)
Collecting Flask==0.12.2 (from -r requirements.txt (line 3))
Downloading Flask-0.12.2-py2.py3-none-any.whl (83kB)
Collecting Flask-RESTful==0.3.6 (from -r requirements.txt (line 4))
Downloading Flask_RESTful-0.3.6-py2.py3-none-any.whl
Collecting Flask-SQLAlchemy==2.3.2 (from -r requirements.txt (line 5))
Downloading Flask_SQLAlchemy-2.3.2-py2.py3-none-any.whl
Collecting itsdangerous==0.24 (from -r requirements.txt (line 6))
Downloading itsdangerous-0.24.tar.gz (46kB)
Collecting Jinja2==2.9.6 (from -r requirements.txt (line 7))
Downloading Jinja2-2.9.6-py2.py3-none-any.whl (340kB)
Collecting MarkupSafe==1.0 (from -r requirements.txt (line 8))
Downloading MarkupSafe-1.0.tar.gz
Collecting psycopg2==2.7.3.1 (from -r requirements.txt (line 9))
Downloading psycopg2-2.7.3.1.tar.gz (425kB)
Complete output from command python setup.py egg_info:
running egg_info
creating pip-egg-info/psycopg2.egg-info
writing pip-egg-info/psycopg2.egg-info/PKG-INFO
writing dependency_links to pip-egg-info/psycopg2.egg-info/dependency_links.txt
writing top-level names to pip-egg-info/psycopg2.egg-info/top_level.txt
writing manifest file 'pip-egg-info/psycopg2.egg-info/SOURCES.txt'
Error: pg_config executable not found.
Please add the directory containing pg_config to the PATH
or specify the full executable path with the option:
python setup.py build_ext --pg-config /path/to/pg_config build ...
or with the pg_config option in 'setup.cfg'.
----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-01lf5grh/psycopg2/
ERROR: Service 'api' failed to build: The command '/bin/sh -c pip install -r requirements.txt' returned a non-zero code: 1
ここで、私の
Dockerfile
:
FROM python:3.6.3-alpine3.6
WORKDIR /usr/src/app
COPY . .
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
他の多くの人がローカルで同じような問題を抱えているようですが、どれもDockerを使用していないようです。なぜなら、私はローカルの仮想環境をセットアップすることができ、Postgres がローカルにインストールされており、私のローカルの
pg_config
.
コンテナのビルドやセットアップの際に、Dockerは以下のように
pg_config
をコンテナ内で見つけようとしているようです。をインストールする方法はありますか?
pg_config
をコンテナ内にインストールする方法はありますか?
これを回避する方法についてのあらゆる提案を歓迎します。
どのように解決するのですか?
Python 3.4.8, 3.5.5, 3.6.5, 2.7.14 (3を2に置き換えるだけ) でテストしています。
# You can use a specific version too, like python:3.6.5-alpine3.7
FROM python:3-alpine
WORKDIR /usr/src/app
COPY requirements.txt .
RUN \
apk add --no-cache postgresql-libs && \
apk add --no-cache --virtual .build-deps gcc musl-dev postgresql-dev && \
python3 -m pip install -r requirements.txt --no-cache-dir && \
apk --purge del .build-deps
COPY . .
CMD ["python3", "app.py"]
説明: Psycopg をビルドするには、以下のパッケージが必要です。
gcc musl-dev postgresql-dev
. それから、pg_config の実行ファイルも必要です。
postgresql-dev
は動作します。
postgresql-libs
もうまくいき、12MBほど容量が少なくなります。
以下は、回答のオリジナルバージョンです (ベースは
このDockerfile
に基づいています)。当時は Python 3.6 と Alpine 3.7 を含む Docker イメージが提供されていなかったので、純粋な Alpine イメージに手動で Python をインストールしました。もし、Python 2.7をインストールする場合は
apk add py2-pip
(と呼びます)。
py-pip
と呼ばれます)。
FROM alpine:3.7
WORKDIR /usr/src/app
COPY requirements.txt .
RUN \
apk add --no-cache python3 postgresql-libs && \
apk add --no-cache --virtual .build-deps gcc python3-dev musl-dev postgresql-dev && \
python3 -m pip install -r requirements.txt --no-cache-dir && \
apk --purge del .build-deps
COPY . .
CMD ["python3", "app.py"]
関連
-
[解決済み] PythonでファイルのMD5チェックサムを計算するには?重複
-
[解決済み] Spyderを仮想環境で動作させるには?
-
[解決済み] 辞書のキーと値を交換するにはどうすればよいですか?
-
[解決済み] SQLAlchemy: 日付フィールドをフィルタリングする方法は?
-
[解決済み] 文字列のリストを内容に基づいてフィルタリングする
-
[解決済み] python-requests モジュールからのすべてのリクエストをログに記録します。
-
[解決済み] スペースがないテキストを単語のリストに分割する方法
-
[解決済み] matplotlib でプロットの軸、目盛、ラベルの色を変更する方法
-
[解決済み] Python Empty Generator 関数
-
[解決済み] PythonのRequestsモジュールを使ってWebサイトに "ログイン "するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Pythonの要素別タプル演算(sumなど
-
[解決済み] Python 2.7サポート終了?
-
[解決済み] 文字列のリストを内容に基づいてフィルタリングする
-
[解決済み] python-requests モジュールからのすべてのリクエストをログに記録します。
-
[解決済み] Django 1.7で初期マイグレーションからマイグレートバックする方法は?
-
[解決済み] Pythonで、ウェブサイトが404か200かを確認するためにurllibをどのように使用しますか?
-
[解決済み] PySparkでデータフレームのカラムをString型からDouble型に変更する方法は?
-
[解決済み] virtualenvsはどこに作成するのですか?
-
[解決済み] Pythonでランダムなファイル名を生成する最良の方法
-
[解決済み] PythonのRequestsモジュールを使ってWebサイトに "ログイン "するには?