docker -составить не сохраняются postgresql данные - PullRequest
0 голосов
/ 26 марта 2020

Мой docker -компонентный файл:

version: '3'

services:
  app:
    container_name: application
    build: .cloud/php
    image: app-application
    depends_on:
      - pgres
    ports:
      - "9050:9000"
    volumes:
      - ./:/var/www:cached
    networks:
      - application_network

  nginx:
    container_name: application.nginx
    image: nginx
    ports:
      - "8050:8000"
    volumes:
      - .cloud/nginx/nginx.conf:/etc/nginx/conf.d/default.conf:cached
      - ./:/var/www:cached
    depends_on:
      - app
    networks:
      - application_network

  pgres:
    container_name: application.postgres
    image: postgres
    restart: always
    ports:
      - "54325:5432"
    environment:
      POSTGRES_DB: application
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: example
      PGDATA: /tmp
    volumes:
      - .cloud/postgres/data:/var/lib/postgresql/data
    networks:
      - application_network
networks:
  application_network:
    driver: bridge

Когда я запускаю docker -композицию, данные postgresql не сохраняются и база данных полностью сбрасывается. Я попытался поместить том postgresql в его собственную папку / postgresql / data, но результат все тот же. Что мне здесь не хватает?

1 Ответ

0 голосов
/ 27 марта 2020

Проблема здесь

    environment:
      PGDATA: /tmp
    volumes:
      - .cloud/postgres/data:/var/lib/postgresql/data

С помощью PGDATA env var вы явно устанавливаете каталог clustur data . Таким образом, после запуска контейнера (например, через docker-compose up) сервер Postgres сохранит ваши данные в БД в соответствии с настройкой PGDATA в каталоге /tmp. С другой стороны, вы монтируете другой путь в контейнере (/var/lib/postgresql/data) вместо пути /tmp. Таким образом, после запуска docker-compose down контейнер и постоянные данные в /tmp исчезнут навсегда, поскольку /tmp не установлена ​​в качестве точки подключения. Так что, если вам действительно не нужно это делать, лучше вообще не трогать его.

Рабочая конфигурация может выглядеть так (сокращено ради краткости):

version: '3'
services:
  pgres:
    image: "postgres" # use latest official postgres version or a specific version e.g. postgres:10.12
    volumes:
      - .cloud/postgres/:/var/lib/postgresql/data/ # persist data even if container shuts down

Еще одна вещь есть, даже скажем, вы настроили его с помощью PGDATA, например, так:

    environment:
      PGDATA: /tmp
    volumes:
      - .cloud/postgres/data:/tmp

Это не будет хорошей идеей, так как путь /tmp в вашем случае, как имя tmp ( временный ) предполагает, действительно не надежный. docker-compose down, вероятно, никак не повлияет на него, но при следующей загрузке, т. Е. После повторного запуска docker-compose up базовая ОС (Linux) с большой вероятностью удалит содержимое каталога /tmp, поэтому смонтированный локальный каталог .cloud/postgres/data также будет немедленно очищен, а ваши сохраненные данные исчезнут. В любом случае /tmp dir в некоторой степени управляется Linux, поэтому сохраненные там данные могут просто исчезнуть в любое время - так что не надейтесь на это!

...