Как использовать объем в докере для создания 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:[email protected]: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: {}

Я получаю следующее

[email protected] 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 не может найти его

Может кто-нибудь помочь мне?

Ответы

Ответ 1

Сведения о файле docker-compose

  • Во-первых, я подумал об этом, потому что вы не используете опцию "ссылки", чтобы связать свой контейнер postgres с веб-контейнером - это хорошая практика, если вы не расширяете порты, но вы расширяете порт postgres.

  • Если вы хотите использовать наследование из изображения, которое вы разместили Вместо использования этой строки:

my_image/PostgreSQL: 9,3

использование:

docker/postgres

и создайте докеры /postgres пути и там разместите файл Docker с ингаляцией из контейнера, который вы хотите.

  1. Я всегда использую разделы общего доступа в файле docker-compose.yml следующим образом:

    .:/var/www/html

где . - это мой путь к проекту, где я помещаю свои файлы кода.

Изображение, которое я создал для проверки этого случая

У меня нет всей структуры файлов докеров, чтобы воспроизвести эту ошибку и исправить ее, поэтому я создал состав 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 - путь на вашем локальном хосте. Вам также необходимо изменить учетные данные на db в документации док-станции на ваши старые учетные данные. Вы должны сделать это, прежде чем запускать docker-compose, потому что, если db не существует, будет разбито.

Любые вопросы, дайте мне знать.

Ответ 2

Если том является внешним и уже существует до использования docker-compose, вы должны объявить его внешним, иначе компоновка докеров будет создавать новый том с именем проекта в качестве префикса.

volumes:
  test_volume:
   external: true

Источник: https://docs.docker.com/compose/compose-file/#external

Ответ 3

Я думаю, что это может быть что-то вроде этого для вас.

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 docs (https://docs.docker.com/engine/tutorials/dockervolumes/), просмотрите обучающие программы (есть канал Docker Youtube с большими учебниками) и прочитайте другие темы перед размещение нового...