web-dev-qa-db-ja.com

postgresのdocker composeでボリュームを使用するには?

これが image を使用しています。

posgres_testという名前を付けました

画像を個別に実行する場合

docker run -i -t -v="test_volume:/var/lib/postgresql" -p 5432:5432 posgres_test

でアクセスできます

psql -h 192.168.99.100 -p 5432 -U pguser -W pgdb

または、golangアプリでアクセスできます

// Host is set to postgres
db, err := sql.Open("postgres", "postgres://pguser:pguser@postgres:5432/pgdb")
// table test_db is manually created.
rows, err := db.Query("SELECT name FROM test_db WHERE)

ただし、docker composeを使用する場合

docker-compose.yml

version: "2"
services:
  postgres:
    image: my_image/postgresql:9.3
    volumes:
      - test_volume:/var/lib/postgresql
    ports:
      - "5432:5432"
  web:
    image: my-golang-app4
    ports:
      - "8080:8080"
volumes:
  test_volume: {}

私は次のようになります

pguser@pgdb ERROR:  relation "test_db" does not exist at character 15

test_dbtest_volumeに存在することは確かです

docker run -i -t -v="test_volume:/var/lib/postgresql" -p 5432:5432 posgres_test
psql -h 192.168.99.100 -p 5432 -U pguser -W pgdb

\dt

作成したテーブルが表示されます

しかし、Docker Composeの私のアプリはそれを見つけることができないようです

誰か助けてくれますか?

26
Kevin

docker-composeファイルについて

  1. まず、「リンク」オプションを使用してpostgresコンテナーをWebコンテナーにリンクしないためだと考えました-ポートを展開しないのが良い習慣ですが、postgresポートを展開します。

  2. この行を使用する代わりに、投稿した画像からの継承を使用する場合:

my_image/postgresql:9.3

つかいます:

docker/postgres

パスdocker/postgresを作成し、必要なコンテナからの不利益を伴うDockerfileを配置します。

  1. 私は常にdocker-compose.ymlの共有ボリュームを次のように使用します:

    .:/var/www/html

どこ .は、コードファイルを配置するプロジェクトパスです。

このケースをテストするために作成した画像

このエラーを再現して修正するためのすべてのdockerファイル構造はありません。そのため、ニーズに合った、または問題の修正に役立つdocker-composeを作成しました。

version: '2'
services:
  web:
    build: docker/web
    ports:
      - "8080:8080"
    links:
      - dbpostgres 
    volumes:
      - .:/var/www/html   # I will share my code so I map this path
  dbpostgres:
    image: postgres
    volumes:
      - /private/var/lib/postgresql:/var/lib/postgresql
    ports:
      - "5432:5432"
    environment:
      POSTGRES_USER: pguser
      POSTGRES_PASSWORD: pguser
      POSTGRES_DB: pgdb

ノート:

  1. 公式のpostgresイメージを使用することをお勧めします

  2. 行の横にコメントを残しました。

接続方法:

Host=dbpostgres port=5432 dbname=pgdb user=pguser password=pguser

私のWebコンテナはHost dbpostgres(イメージ名とドメイン名)を知っているため、リンクを使用してリンクします。

既存のコンテナのデータベースが必要な場合

既存のコンテナのデータベースが必要な場合は、オプションdocker cpを使用してデータベースのローカルをコピーします。

docker cp posgres_test:/var/lib/postgresql /private/var/lib/postgresql

どこ /private/var/lib/postgresqlはローカルホストのパスです。また、docker-composeで資格情報を古い資格情報のdbに変更する必要があります。 dbが存在しない場合はクレートされるため、docker-composeを実行する前に実行する必要があります。

ご質問、ご連絡ください。

17
Arkowsky

ボリュームが外部であり、docker-composeを使用する前に既に存在している場合は、外部で宣言する必要があります。そうでない場合、docker composeはプレフィックスとしてプロジェクト名を使用して新しいボリュームを作成します。

volumes:
  test_volume:
   external: true

ソース: https://docs.docker.com/compose/compose-file/#external

4
gprivitera

あなたにとってこのようなものになると思います。

docker run -itd -p 5432:5432 --name postgres_test -v /path/in/your/Host :/path/in/your/container postgres_test psql -h 192.168.99.100 -p 5432 -U pguser -W pgdb

Dockerのドキュメントを読んで( https://docs.docker.com/engine/tutorials/dockervolumes/ )、チュートリアルを見る(Docker Youtubeチャンネルには素晴らしいチュートリアルがあります)、新しいトピックを投稿する前に他のトピックを読む1...

0
Thibault Loison