docker 실행 시 postgresql 테이블 생성

docker 실행 시 postgresql 테이블 생성

컨테이너를 실행할 때 PostgreSQL 데이터베이스를 실행하는 Dockerfile을 생성하고 싶습니다.

그래서 제가 한 일은 Dockerfile을 만드는 것이었습니다.

FROM postgres:latest

COPY *.sh /docker-entrypoint-initdb.d/

Dockerfile 초기화 스크립트 "postgres.sh"를 /docker-entrypoint-initdb.d/에 복사합니다. postgres.sh 스크립트에는 다음 내용이 포함되어 있습니다.

#!/bin/sh

su postgres -c "psql << EOF
ALTER USER postgres WITH PASSWORD '123';
create database shippingchallenge;
\c shippingchallenge;
create table people(firstname CHAR(20), surname CHAR(30));
insert into people values ('Pieter', 'Pauwels');
EOF"

그래서 제가 하려는 작업은 "firstname"과 "surname"이라는 두 값을 가진 "people" 테이블을 포함하는 "shippingchallenge" 데이터베이스를 만드는 것입니다. 사용 sudo docker exec -it <container> /bin/bash하고 붙여넣으면 잘 작동합니다.

하지만 위의 방법을 사용하여 생성된 이미지를 실행하면 sudo docker run -p 5432:5432 -e POSTGRES_PASSWORD=123 <image>다음 오류가 발생합니다.

The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.
 
The database cluster will be initialized with locale "en_US.utf8".
The default database encoding has accordingly been set to "UTF18".
The default text search configuration will be set to "english". 

Data page checksums are disabled. 

fixing permissions on existing directory /var/lib/postgresql/data ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix 
selecting default maxconnections ... 100 
selecting default shared_buffers ... 128MB 
selecting default time zone ... Etc/UTC 
creating configuration files ... ok 
running bootstrap script ... ok 
performing post-bootstrap initialization ... ok 
syncing data to disk ... ok 

initdb: warning: enabling "trust" authentication for local connections 
You can change this by editing pg_hba.conf or using the option -A or 
--auth-local and --auth-host, the next time you run initdb.
 
Success. You can now start the database server using: 

    pg_ctl -D /var/lib/postgresql/data -l logfile start 
    
waiting for server to start....2020-12-19 12:42:09.749 UTC [45] LOG: starting PostgreSQL 13.1 (Debian 13.1-1 pgdg100+1) on x86_64 pc linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit
2020-12-19 12:42:09.754 UTC [45] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2020-12-19 12:42:09.771 UTC [46] LOG: database system was shut down at 2020-12-19 12:42:07 UTC
2020-12-19 12:42:09.778 UTC [45] LOG: database system is ready to accept connections
 done 
server started 

/usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/postgres.sh 
Password: su: Authentication failure 

콘텐츠 /etc/pam.d/su:

auth       sufficient pam_rootok.so





session       required   pam_env.so readenv=1
session       required   pam_env.so readenv=1 envfile=/etc/default/locale

session    optional   pam_mail.so nopen

session    required   pam_limits.so

@include common-auth
@include common-account
@include common-session

당신의 도움에 미리 감사드립니다!

답변1

이는 빌드할 때 SQL 문이 포함된 스크립트 파일을 docker-entrypoint-initdb.d 디렉터리에 배치하여 수행됩니다.관습공식 Postgres가 포함된 이미지~에 따르면영상https://github.com/docker-library/postgres

docker-context-dir
  /docker-entrypoint-initdb.d
    |-create-table.sql
  |-Dockerfile

도커파일

FROM postgres:latest
COPY docker-entrypoint-initdb.d /docker-entrypoint-initdb.d

table.sql 생성

CREATE TABLE people (
    id SERIAL PRIMARY KEY,
    ...);

답변2

실행 권한과 및 내용으로 인해 /bin/su문제가 발견되지 않았습니다 . 문제없어요!/etc/pam.d/su/etc/pam.d/su-limage

이미지를 로컬에서 가져온 후에 오류가 발생한 것 같습니다 . 스크립트에 su postgres -c추가하면 스크립트가 기본적으로 실행된다는 것을 알 수 있기 때문에 제거해야 합니다. 이는 시작 시 컨테이너가 생성되기 때문입니다 . 데몬은 해당 사용자로 시작되어야 합니다.whoamipostgresqlsupostgres

도커 파일:

FROM registry.hub.docker.com/library/postgres
COPY postgres.sh /docker-entrypoint-initdb.d/
RUN chmod +x /docker-entrypoint-initdb.d/postgres.sh

스크립트:

#!/bin/bash
whoami 
psql << EOF
ALTER USER postgres WITH PASSWORD '123';
create database shippingchallenge;
\c shippingchallenge;
create table people(firstname CHAR(20), surname CHAR(30));
insert into people values ('Pieter', 'Pauwels');
EOF

시험:

docker exec -it <container> bash 
su postgres 
psql
postgres=# \l

산출(테이블이 생성되었으며 소유자는 postgres입니다):

shippingchallenge|postgres|UTF8|en_US.utf8|en_US.utf8|

그렇기 때문에 사용자의 비밀번호를 su묻는 이유 postgres는 아무 것도 전달되지 않기 때문입니다.확인 실패빌드 중.

관련 정보