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

时间:2017-02-08 07:43:34

标签: postgresql docker docker-compose

以下是我正在使用的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撰写的应用无法找到它

有人能帮助我吗?

3 个答案:

答案 0 :(得分:15)

关于您的docker-compose文件

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

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

  3.   

    my_image / PostgreSQL的:9.3

    使用:

    docker/postgres
    

    并创建路径docker / postgres,并在Dockerfile中放置所需容器的吸引力。

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

      .:/var/www/html

    2. 其中.是我放置代码文件的项目路径。

      为测试此案例而创建的图片

      我没有你的所有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
      

      注意:

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

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

      3. 我如何建立联系:

        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

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

答案 2 :(得分:0)

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

<html ng-app="testApp">

阅读Docker文档(https://docs.docker.com/engine/tutorials/dockervolumes/),观看教程(有一个Docker Youtube频道,附带很棒的教程)并在发布新教程之前阅读其他主题......