web-dev-qa-db-fra.com

Comment utiliser le volume dans docker composer pour postgres?

Voici le image que j'utilise.

Je l'ai nommé posgres_test

Si je lance l'image individuellement

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

Je peux y accéder avec

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

Ou je peux y accéder avec mon application 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)

Cependant si j'utilise 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: {}

Je reçois le suivant

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

Je sais pour sûr test_db exister dans test_volume puisque

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

montrera le tableau que j'ai créé

Mais il semble que mon application dans docker compose ne puisse pas la trouver

Est-ce que quelqu'un peut m'aider?

26
Kevin

À propos de votre fichier docker-compose

  1. Tout d'abord, je pensais que c'était parce que vous n'utilisiez pas l'option 'links' pour lier votre conteneur Postgres à un conteneur Web. Il est recommandé de ne pas développer les ports, mais de développer le port postgres.

  2. Si vous souhaitez utiliser l'héritage de l'image que vous avez publiée Au lieu d'utiliser cette ligne:

mon_image/postgresql: 9.3

utilisation:

docker/postgres

et créez le chemin docker/postgres et placez-y Dockerfile avec l'inharitance du conteneur que vous souhaitez.

  1. J'utilise toujours le partage de volumes dans docker-compose.yml comme ceci:

    .:/var/www/html

. est mon chemin de projet où je place mes fichiers de code.

Image que j'ai créée pour tester ce cas

Je ne dispose pas de la structure de tous vos fichiers Docker pour reproduire cette erreur et la corriger. J'ai donc créé Docker-Composer qui devrait correspondre à vos besoins ou vous aider à résoudre votre problème:

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

Remarques:

  1. Je recommanderai d'utiliser postgres officiel image

  2. J'ai laissé des commentaires à côté des lignes.

Comment j'ai établi la connexion:

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

Parce que mon conteneur Web connaît maintenant l'hôte dbpostgres (nom de l'image et nom de domaine), je les relie à l'aide de liens.

Si vous avez besoin de la base de données d'un conteneur existant

Si vous avez besoin de la base de données de votre conteneur existant, utilisez simplement l'option docker cp pour copier la base de données localement:

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

/private/var/lib/postgresql est le chemin sur votre hôte local. Vous devez également modifier les informations d’identification en db dans docker-compos à vos anciennes informations d’identité. Vous devez le faire avant d’exécuter docker-compose car si db n’existe pas, il sera créé.

Toutes les questions, laissez-moi savoir.

17
Arkowsky

Si le volume est externe et qu'il existait déjà avant l'utilisation de docker-compose, vous devez le déclarer externe. Sinon, docker compose créera un nouveau volume avec le nom du projet comme préfixe.

volumes:
  test_volume:
   external: true

Source: https://docs.docker.com/compose/compose-file/#external

4
gprivitera

Je pense que cela devrait être quelque chose comme ça pour vous.

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

Lisez la documentation Docker ( https://docs.docker.com/engine/tutorials/dockervolumes/ ), regardez des tutoriels (il existe une chaîne Youtube de Docker avec d'excellents tutoriels) et lisez d'autres sujets avant de publier un nouveau une...

0
Thibault Loison