PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

docker-soạn postgres khởi động lại sau khi chạy các tập lệnh trong docker-entrypoint-initdb.d

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Đếm khoảng cách được nhóm theo thời gian cho phạm vi thời gian

  2. Sao lưu &khôi phục cơ sở dữ liệu PostgreSQL và thiết lập môi trường localhost với laravel trong windows 7

  3. “CẢNH BÁO:Không khớp được tìm thấy giữa sl_table và pg_class.” ở Slony-I

  4. Lưu trữ và lập chỉ mục YAML với PostgreSQL, với Javascript lib hoặc các chức năng có thể tái sử dụng?

  5. Postgresql date_trunc với múi giờ dịch chuyển múi giờ 1 giờ