Digamos que tengo la siguiente configuración en mi docker-compose.yml.

services:

  postgres:
    image: postgres:11.6
    env_file:
      - .local.env
    volumes:
      - ./database/:/docker-entrypoint-initdb.d
    ports:
      - 5432:5432
    ...

Donde ./database contiene algunos archivos SQL que inicializan la base de datos. Aquí está mi pregunta ... es initdb ejecutar cada vez que el contenedor de postgres detenido comienza a ejecutarse nuevamente (a través de $ docker-compose up).

Esto, ¿es justo decir que cada vez que reinicio mi contenedor de postgres, vuelve a compilar toda la base de datos desde cero?

Supongo que 'sí' como en la documentación que dice

El usuario y la base de datos predeterminados de Postgres se crean en el punto de entrada con initdb.

-1
Noah Stebbins 20 feb. 2021 a las 20:12

1 respuesta

La mejor respuesta

La respuesta es no, cuando detienes tu contenedor no se elimina, solo se detiene, puedes iniciarlo cuando se detiene lo mismo cuando detienes tu computadora no desaparecerá de tu escritorio :) Incluso puedes reiniciarlo cuando esté funcionando, al igual que lo haría con su computadora.

Sin embargo, cuando elimina / elimina el contenedor con

docker rm -f containername

O

docker-compose rm

Entonces se elimina realmente, equivalente a hacer que su computadora desaparezca de su escritorio.

Pero incluso si aún puede conservar sus datos con montajes de volumen, por ejemplo, en su archivo de redacción, su directorio ./database no se eliminará de su máquina host, incluso cuando elimine los contenedores que lo usan. Es el equivalente a usar una unidad USB externa en su computadora, por lo que cuando hace que su computadora desaparezca de su escritorio al eliminarla, todavía tiene su unidad USB con los datos que estaban allí cuando todavía tenía su computadora.

Por lo tanto, puede conservar los archivos de su base de datos con la misma técnica en un montaje de volumen como este:

services:

  postgres:
    image: postgres:11.6
    env_file:
      - .local.env
    volumes:
      - ./database/:/docker-entrypoint-initdb.d
      - ./postgres-data/data:/var/lib/postgresql/data
    ports:
      - 5432:5432
    ...

De esta manera, cuando elimine su contenedor (s) y haga "docker-compose up" nuevamente para el mismo archivo de composición, postgres no ejecutará su scirpt de inicio porque el directorio / var / lib / postgresql ya está poblado en él.

Sin embargo, mi analogía con la computadora es válida solo en este contexto, por favor no piense que los contenedores son mini computadoras o mini máquinas virtuales, ¡no lo son! Pero esa es otra discusión.

1
E_net4 could use more flags 21 feb. 2021 a las 15:48