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?
À propos de votre fichier docker-compose
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.
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.
J'utilise toujours le partage de volumes dans docker-compose.yml comme ceci:
.:/var/www/html
où .
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:
Je recommanderai d'utiliser postgres officiel image
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
où /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.
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
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...