Nói một cách đơn giản, điều này xảy ra có chủ đích; tác giả thực hiện nó như một phần của quá trình khởi tạo.
Có vẻ như một số câu trả lời có thể được tìm thấy trong tập lệnh shell entrypoint của hình ảnh:
_main() {
# if first arg looks like a flag, assume we want to run postgres server
if [ "${1:0:1}" = '-' ]; then
set -- postgres "[email protected]"
fi
if [ "$1" = 'postgres' ] && ! _pg_want_help "[email protected]"; then
docker_setup_env
# setup data directories and permissions (when run as root)
docker_create_db_directories
if [ "$(id -u)" = '0' ]; then
# then restart script as postgres user
exec gosu postgres "$BASH_SOURCE" "[email protected]"
fi
# only run initialization on an empty data directory
if [ -z "$DATABASE_ALREADY_EXISTS" ]; then
docker_verify_minimum_env
# check dir permissions to reduce likelihood of half-initialized database
ls /docker-entrypoint-initdb.d/ > /dev/null
docker_init_database_dir
pg_setup_hba_conf
# PGPASSWORD is required for psql when authentication is required for 'local' connections via pg_hba.conf and is otherwise harmless
# e.g. when '--auth=md5' or '--auth-local=md5' is used in POSTGRES_INITDB_ARGS
export PGPASSWORD="${PGPASSWORD:-$POSTGRES_PASSWORD}"
docker_temp_server_start "[email protected]"
docker_setup_db
docker_process_init_files /docker-entrypoint-initdb.d/*
docker_temp_server_stop
unset PGPASSWORD
echo
echo 'PostgreSQL init process complete; ready for start up.'
echo
else
echo
echo 'PostgreSQL Database directory appears to contain a database; Skipping initialization'
echo
fi
fi
exec "[email protected]"
}
Đối với "tại sao?" Tôi nghĩ đó là vì mong muốn được chạy như một người dùng ít đặc quyền hơn.
Bạn có thể "giải quyết" vấn đề bằng cách chỉ định một ổ đĩa trong tệp Soạn như sau:
volumes:
- ./data/pgsql:/var/lib/postgresql/data
Sau đó, nó sẽ bỏ qua quy trình để đảm bảo DATABASE_ALREADY_EXISTS
.
Hoặc, nếu điều đó không hữu ích - bạn có thể tìm hiểu thêm một chút về tập lệnh entrypoint.