La otra respuesta apunta a la causa raíz del problema, sin embargo, la página de ayuda a la que apunta no contiene una solución. Esto es lo que se me ocurrió para que esto funcione para mí:
- inicie el contenedor usando su archivo docker-compose normal, esto crea el directorio con el uid:gid (999:999) codificado de forma rígida
version: '3.7'
services:
db:
image: postgres
container_name: postgres
volumes:
- ./data:/var/lib/postgresql/data
environment:
POSTGRES_USER: fake_database_user
POSTGRES_PASSWORD: fake_database_PASSWORD
- detenga el contenedor y cambie manualmente la propiedad a uid:gid que desee (usaré 1000:1000 para este ejemplo
$ docker stop postgres
$ sudo chown -R 1000:1000 ./data
- Edite su archivo docker para agregar su uid:gid deseado y vuelva a iniciarlo usando docker-compose (observe el
user:
)
version: '3.7'
services:
db:
image: postgres
container_name: postgres
volumes:
- ./data:/var/lib/postgresql/data
user: 1000:1000
environment:
POSTGRES_USER: fake_database_user
POSTGRES_PASSWORD: fake_database_password
La razón por la que no puedes simplemente usar user:
desde el principio es que si la imagen se ejecuta como un usuario diferente, no se pueden crear los archivos de datos.
En la página de documentación de imágenes
, menciona una solución para agregar un volumen para exponer el /etc/passwd
archivo como de solo lectura en la imagen al proporcionar --user
Sin embargo, esa opción no funcionó para mí con la última imagen, ya que recibí el siguiente error. De hecho, ninguna de las tres soluciones propuestas funcionó para mí.
initdb: error: could not change permissions of directory "/var/lib/postgresql/data": Operation not permitted