컨테이너를 실행할 때 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-l
image
이미지를 로컬에서 가져온 후에 오류가 발생한 것 같습니다 . 스크립트에 su postgres -c
추가하면 스크립트가 기본적으로 실행된다는 것을 알 수 있기 때문에 제거해야 합니다. 이는 시작 시 컨테이너가 생성되기 때문입니다 . 데몬은 해당 사용자로 시작되어야 합니다.whoami
postgresql
su
postgres
도커 파일:
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
는 아무 것도 전달되지 않기 때문입니다.확인 실패빌드 중.