私はいくつかの異なるチュートリアルと公式のチュートリアルに従っていますが、コンテナ内にPostgreSQLをインストールしようとするたびに、次のメッセージが表示されます
psql: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
SOおよびインターネット全体でいくつかの質問を調べましたが、うまくいきませんでした。
問題は、アプリケーション/プロジェクトが(Dockerコンテナーではなく)ホストマシンのpostgresソケットファイルにアクセスしようとしていることです。
これを解決するには、-p
フラグを使用してpostgresコンテナのポートを設定するときに、tcp/ip接続を明示的に要求するか、-v
フラグを使用してUNIXソケットをホストマシンと共有する必要があります。
:注:-v
または--volume=
フラグを使用すると、ホストマシンとdockerコンテナーの間でスペースを共有することになります。つまり、ホストマシンにpostgresがインストールされており、その実行中に問題が発生する可能性があります。
以下では、tcp/ipとunixソケットの両方からアクセス可能なpostgresコンテナを実行する方法を示します。また、コンテナにpostgres
という名前を付けています。
docker run -p 5432:5432 -v /var/run/postgresql:/var/run/postgresql -d --name postgres postgres
他の解決策もありますが、これが最も適していると思います。最後に、アクセスを必要とするアプリケーション/プロジェクトがコンテナでもある場合は、それらをリンクすることをお勧めします。
デフォルトでは、psql
はUNIXソケットを使用してサーバーに接続しようとしています。そのため、/ var/run/postgresql/.s.PGSQL.5432-UNIXソケット記述子の場所が表示されます。
ポートバインディングを使用してdockerでpostgresql-serverを実行する場合は、TCPソケットを使用するようにpsql
に指示する必要があります。 Host
param(--Host
または-h
):
psql -h localhost [any other params]
Dockerコンテナでも機能するはずのエラーを修正する手順を次に示します。 PostgreSQLエラー 'サーバーに接続できませんでした:そのようなファイルまたはディレクトリはありません'
それが何らかの理由で機能しない場合は、Dockerインデックスで参照のために確認できる市販のpostgresql Dockerコンテナが多数あります。 https://index.docker.io/search?q = postgresql
コンテナの多くは、githubの信頼できるリポジトリから構築されています。したがって、ニーズを満たしていると思われるものを見つけた場合は、ソースを確認できます。
Flynnプロジェクトには、チェックアウトする価値のあるpostgresqlアプライアンスも含まれています。 https://github.com/flynn/flynn-postgres
FROM postgres:9.6
実行apt-get update && apt-get install -q -y postgresql-9.6 postgresql-client-9.6 postgresql-contrib-9.6 postgresql-client-common postgresql-common RUN echo postgres:postgres | chpasswd
実行pg_createcluster 9.6 main --start
RUN /etc/init.d/postgresql start
RUN su -c "psql -c \" ALTER USER postgres PASSWORD 'postgres';\"" postgres