这是我正在使用的 图像。
我把它命名为 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
将显示我创建的表
但似乎我在 docker compose 中的应用找不到它
有人可以帮我吗?
原文由 Kevin 发布,翻译遵循 CC BY-SA 4.0 许可协议
关于您的 docker-compose 文件
首先,我认为这是因为您不使用“链接”选项将您的 postgres 容器链接到 Web 容器 - 如果您不扩展端口,这是一个很好的做法 - 但您扩展了 postgres 端口。
如果您想使用您发布的图片的继承
而不是使用这一行:
利用:
并创建路径
docker/postgres
并在那里放置Dockerfile
并继承您想要的容器。docker-compose.yml
中使用共享卷,如下所示:其中
.
是我放置代码文件的项目路径。我为测试这种情况而创建的图像
我没有你所有的 docker 文件结构来重现这个错误并修复它,所以我创建了一个
docker-compose
,它应该符合你的需求或帮助解决你的问题:笔记:
我会推荐使用官方 postgres 图像
我在行旁边留下了评论。
我是如何建立联系的:
因为我的 Web 容器现在知道主机 dbpostgres(图像名称和域名) - 我使用链接链接它们。
如果您需要现有容器中的数据库
如果您需要现有容器中的数据库,只需使用 docker 选项
cp
在本地复制数据库:其中
/private/var/lib/postgresql
是本地主机上的路径。您还需要将 docker-compose 中的 db 凭据更改为您的旧凭据。您必须在运行docker-compose
之前执行此操作,因为如果 db 不存在,它将被创建。有任何问题,请告诉我。