如何使用docker中的音量构成postgres?

Kev*_*vin 28 postgresql docker docker-compose

这是我正在使用的图像.

我把它命名了 posgres_test

如果我单独运行图像

docker run -i -t -v="test_volume:/var/lib/postgresql" -p 5432:5432 posgres_test
Run Code Online (Sandbox Code Playgroud)

我可以访问它

psql -h 192.168.99.100 -p 5432 -U pguser -W pgdb
Run Code Online (Sandbox Code Playgroud)

或者我可以使用我的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)
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用 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: {}
Run Code Online (Sandbox Code Playgroud)

我得到以下内容

pguser@pgdb ERROR:  relation "test_db" does not exist at character 15
Run Code Online (Sandbox Code Playgroud)

我知道肯定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
Run Code Online (Sandbox Code Playgroud)

将显示我创建的表格

但似乎我在docker撰写的应用程序无法找到它

有人可以帮我吗?

Ark*_*sky 17

关于您的docker-compose文件

  1. 首先我认为这是因为你不使用'links'选项将你的postgres容器链接到web容器 - 如果你不扩展端口,这是一个很好的做法 - 但你扩展了postgres端口.

  2. 如果您想从您发布的图像中使用继承而不是使用此行:

my_image/PostgreSQL的:9.3

使用:

docker/postgres
Run Code Online (Sandbox Code Playgroud)

并创建路径docker/postgres,并在那里放置Dockerfile从您想要的容器吸入.

  1. 我总是在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
Run Code Online (Sandbox Code Playgroud)

笔记:

  1. 我会建议使用官方的postgres图像

  2. 我在旁边留下了评论.

我是如何建立联系的:

host=dbpostgres port=5432 dbname=pgdb user=pguser password=pguser
Run Code Online (Sandbox Code Playgroud)

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

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

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

docker cp posgres_test:/var/lib/postgresql /private/var/lib/postgresql
Run Code Online (Sandbox Code Playgroud)

/private/var/lib/postgresql你本地主机的路径在哪里.您还需要在docker-compose中将凭据更改为db到您的旧凭据.您必须在运行docker-compose之前执行此操作,因为如果db不存在,则会被创建.

有任何问题,请告诉我.


gpr*_*era 5

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

volumes:
  test_volume:
   external: true
Run Code Online (Sandbox Code Playgroud)

external使用 compose v3 的文档(大部分类似于v2):https : //docs.docker.com/compose/compose-file/compose-file-v3/#external


Thi*_*son 1

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

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
Run Code Online (Sandbox Code Playgroud)

阅读 Docker 文档(https://docs.docker.com/engine/tutorials/dockervolumes/),观看教程(有一个 Docker Youtube 频道,里面有很棒的教程)。