web-dev-qa-db-ja.com

Postgres、Docker Compose、およびPsycopg2を使用してホスト名「db」をアドレスに変換できませんでした

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を書きましたか?

7
gongarek

問題は、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: alwaysdocker-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

うまくいけば、これはあなたを立ち上げて実行するでしょう。

7
Jack Gore