以下是我正在使用的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_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撰写的应用无法找到它
有人能帮助我吗?
答案 0 :(得分:15)
关于您的docker-compose文件
首先我认为这是因为你不使用'links'选项将你的postgres容器链接到web容器 - 如果你不扩展端口,这是很好的做法 - 但你扩展了postgres端口。
如果您想从您发布的图片中使用继承 而不是使用这一行:
my_image / PostgreSQL的:9.3
使用:
docker/postgres
并创建路径docker / postgres,并在Dockerfile中放置所需容器的吸引力。
我总是在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
注意:
我建议使用官方的postgres图像
我在旁边留下了评论。
我如何建立联系:
host=dbpostgres port=5432 dbname=pgdb user=pguser password=pguser
因为我的网络容器现在知道主机dbpostgres(图像名称和域名) - 我使用链接链接它们。
如果您需要现有容器中的数据库
如果您需要现有容器中的数据库,只需使用选项docker cp复制数据库localy:
docker cp posgres_test:/var/lib/postgresql /private/var/lib/postgresql
其中/private/var/lib/postgresql
是您本地主机上的路径。
您还需要在docker-compose中将凭据更改为db到您的旧凭据。
您必须在运行docker-compose之前执行此操作,因为如果db不存在,则会被创建。
如有任何问题,请与我们联系。
答案 1 :(得分:3)
如果在使用docker-compose之前卷是外部卷并且已经存在,则应将其声明为外部卷,否则docker compose将创建一个项目名称为前缀的新卷。
volumes:
test_volume:
external: true
答案 2 :(得分:0)
我认为这对你来说应该是这样的。
<html ng-app="testApp">
阅读Docker文档(https://docs.docker.com/engine/tutorials/dockervolumes/),观看教程(有一个Docker Youtube频道,附带很棒的教程)并在发布新教程之前阅读其他主题......