如何在Docker中使用音量组成postgres?

这是我正在使用的图像 。

我把它命名为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_db存在于test_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 

将显示我创build的表

但是好像我在Docker撰写的应用程序找不到它

有人可以帮我吗?

关于你的docker-compose文件

  1. 首先,我认为这是因为你不使用“链接”选项来链接你的postgres容器到web容器 – 这是一个很好的做法,如果你不扩大端口 – 但你扩大postgres端口。

  2. 如果你想使用你张贴的图像的inheritance而不是使用这一行:

my_image / PostgreSQL的:9.3

使用:

 docker/postgres 

并创buildpathdocker/ postgres和那里从你想要的容器中吸入的Dockerfile。

  1. 我总是在docker-compose.yml中使用共享卷,如下所示:

    .:/var/www/html

哪里. 是我放置我的代码文件的项目path。

我创build的图像来testing这种情况

我没有你的所有docker文件结构来重现这个错误,并修复它,所以我创build了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. 我在旁边留言。

我如何build立连接:

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

因为我的Web容器现在知道主机dbpostgres(图像名称和域名) – 我使用链接链接它们。

如果你需要现有容器的数据库

如果你需要现有容器的数据库,只需使用选项docker cp复制数据库localy:

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

其中/private/var/lib/postgresql是本地主机上的path。 你还需要在docker-compose中将凭据更改为db。 你必须在运行docker-compose之前这样做,因为如果db不存在,将会被创build。

有任何问题,请告诉我。

如果在使用docker-compose之前该卷是外部的并且已经存在,则应该将其声明为external,否则docker compose将创build一个以项目名称为前缀的新卷。

 volumes: test_volume: external: true 

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

我认为这对你来说应该是这样的。

 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频道whith伟大的教程),并阅读其他主题,然后发布一个新的…