web-dev-qa-db-ja.com

docker-compose:postgresのシェルへのアクセス(psql)

docker-composeを使用してPostgreSQLのシェル(psql)にアクセスしようとしていますが、問題が発生しています...これが私のdocker-composeファイルです。

main:
  build: .
  volumes:
    - .:/code
  links:
    - postgresdb
  environment:
    - DEBUG=true


postgresdb:
  build: utils/sql/
  ports:
    - "5432"
  environment:
    - DEBUG=true

psqlサービスとmainサービスを実行して、postgresdbにアクセスしようとしました。

docker-compose run postgresdb psql -h postgresdb -U docker mydatabase

しかし、私が得るのはpsql: could not translate Host name "postgresdb" to address: Name or service not known...だけです。これは、データベース構成ファイルのホストとしてpostgresdbを使用しているため、理解できません。例:

DB_ACCESS = {
    'drivername': 'postgres',
    # Name of docker-compose service
    'Host': 'postgresdb',
    'port': '5432',
    'username': 'docker',
    'password': '',
    'database': 'mydatabase'
}
13
aralar

Postgresdbコンテナをそれ自体から接続しようとしていますが、コンテナはpostgresdbコンテナ内に設定したエイリアスmainを認識していません。

次の例を考えてみましょう。

$ docker run -it --rm ubuntu hostname --fqdn
817450b29b34

これで、Postgresdbがpostgresdbを解決する方法を知らないことがわかります。しかし、postgresdbはとにかくmainから解決できるはずです。

これを修正するいくつかの機会があります:

  1. Postgresdbのホスト名を明示的に設定してみてください(docker-compose.yml);
  2. mainコンテナから次のようにPostgresdbにアクセスします:$ docker exec -it main_container_full_name psql -h postgresdb -U docker mydatabase
2
Vitaly Isaev

質問が最初に行われてから、状況は少し変わりました。

Docker-composeを使用してPostgreSQLのシェル(psql)にアクセスする方法は次のとおりです。

  1. Docker-compose.ymlバージョン「2」の設定ファイルを使用します
  2. 「リンク」ではなく「depends_on」を使用します(バージョン「2」の新機能)
  3. 「サービス」を使用してコンテナを分割します

docker-compoose.yml

version: '2'
services:      
   postgresdb:
     build: utils/sql/
     ports:
       - "5432"
     environment:
       - DEBUG=true
   main:
     build: .
     volumes:
       - .:/code
     depends_on:
       - postgresdb
     environment:
       - DEBUG=true

Dockerエンジンシェルで...

  1. docker psコマンドからコンテナーID(またはコンテナー名)を見つけます
  2. そのIDを使用してシェルプロンプトを開きます
  3. ユーザーをpostgresユーザーアカウントに切り替えます
  4. Psqlを実行します

以下の例を参照してください。

                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/
 _                 _   ____     _            _
| |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 1.11.2, build HEAD : a6645c3 - Wed Jun  1 22:59:51 UTC 2016
Docker version 1.11.2, build b9f10c9
docker@default:~$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
b563764171e2        poc_web             "bundle exec Rails s "   43 minutes ago      Up 43 minutes       0.0.0.0:3000->3000/tcp   poc_web_1
c6e480b0f26a        postgres            "/docker-entrypoint.s"   49 minutes ago      Up 49 minutes       0.0.0.0:5432->5432/tcp   poc_db_1
docker@default:~$ docker exec -it c6e480b0f26a sh
# su - postgres
No directory, logging in with HOME=/
$ psql
psql (9.5.3)
Type "help" for help.

postgres=#

注:

  1. docker-compose upは、依存関係の順序でサービスを開始します
  2. 公式イメージを使用してpostgresコンテナーを立ち上げたい場合、docker-compose.ymlは次のようになります。

version: '2' services:
db: image: postgres ports: - "5432:5432" . . .

参照

https://docs.docker.com/compose/compose-file/

15
l3x

参照用に最小限のdocker-compose.ymlファイルから始めましょう。

version: "3"

services:
  postgres:
    image: postgres:9.5

あなたはdocker-compose upであなたのサービスを立ち上げます。

接続したいデータベースがtestと呼ばれていると仮定しましょう。

回答:docker-compose run postgres psql -h YOUR_SERVICE -U YOUR_USER -d YOUR_DATABASE

この例では、これはdocker-compose run postgres psql -h postgres -U postgres -d testになります。

または、psqlの接続文字列を使用することもできます:docker compose run postgres psql -d postgres://YOUR_USER@YOUR_SERVICE/YOUR_DATABASE

9
Tate Thurston

以下は私のために働いた:

in docker-compose.yaml

services:
  db:
    container_name: db
    image: postgres

次に、docker-compose upを実行した後

走れる

Sudo docker exec -it -u postgres db psql
postgres=#

シェルを取得するには

注:

  1. Docker-composeバージョン3を使用しています
  2. Psqlコンテナに名前を付けました(db)。これにより、docker psを実行してcontainer_idを取得することを回避できました。
  3. -u postgresを使用すると、postgresスーパーユーザーとしてコンテナにアクセスできます。
0
Daniel