1つのフォルダーには、base.py、Dockerfile、およびdocker-compose.ymlの3つのファイルがあります。
base.py:
import psycopg2
conn = psycopg2.connect("dbname='base123' user='postgres' Host='db' password='pw1234'")
Dockerfile:
FROM ubuntu:16.04
RUN apt-get update
RUN apt-get -y install python-pip
RUN apt-get update
RUN pip install --upgrade pip
RUN pip install psycopg2-binary
COPY base.py base.py
RUN python base.py
docker-compose.yml:
version: '3'
services:
db:
image: 'postgres:latest'
expose:
- "5432"
environment:
POSTGRES_PASSWORD: pw1234
POSTGRES_DB: base123
aprrka:
build: .
depends_on:
- db
実行した後docker-compose up
、次のエラーが表示されました。
Traceback (most recent call last):
File "base.py", line 5, in <module>
conn = psycopg2.connect("dbname='base123' user='postgres' Host='db' password='pw1234'")
File "/usr/local/lib/python2.7/dist-packages/psycopg2/__init__.py", line 130, in connect
conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: could not translate Host name "db" to address: Name or service not known
ERROR: Service 'aprrka' failed to build: The command '/bin/sh -c python base.py' returned a non-zero code: 1
このエラーが発生する理由はわかりません。ポート5432を公開しました。デフォルトでは、Composeはアプリ用に単一のネットワークをセットアップします。各サービスはデフォルトのネットワークに参加します。postgresを使用するアプリは連携して動作するはずです。間違ったdocker-compose.ymlを書きましたか?
問題は、RUN
ディレクティブの一部としてpython base.py
を実行してはならないことです。
RUN
ディレクティブは、イメージをビルドしているときにのみ実行されます。 postgres
コンテナはこの時点では実行されておらず、ネットワークも作成されていません。代わりに、CMD
ディレクティブを使用します。
Dockerfile
を次のように変更します。
FROM ubuntu:16.04
RUN apt-get update
RUN apt-get -y install python-pip
RUN apt-get update
RUN pip install --upgrade pip
RUN pip install psycopg2-binary
COPY base.py base.py
CMD ["python", "base.py"]
上記の結果、ホスト名db
が解決されるはずです。ただし、pythonコードにデータベースに接続するための再接続ロジックがない場合、コンテナはおそらくエラーになります。これはpostgres
コンテナは実行されますが、データベース接続を受け入れる準備ができていません。
これは、restart: always
をdocker-compose.yml
に追加することで一時的に修正できます。
version: '3'
services:
db:
image: 'postgres:latest'
expose:
- "5432"
environment:
POSTGRES_PASSWORD: pw1234
POSTGRES_DB: base123
aprrka:
restart: always
build: .
depends_on:
- db
うまくいけば、これはあなたを立ち上げて実行するでしょう。