postgresql - postgres启动后如何防止docker退出
问题描述
我正在尝试在 docker 中构建一个自定义的 postgres 复制集群。我正在使用postgres:9.6-alpine
作为我的基本图像。这是我Dockerfile
用来构建从属容器的 s。
// Dockerfile
FROM postgres:9.6-alpine
ENV GOSU_VERSION 1.10
RUN set -ex; \
\
apk add --no-cache --virtual .gosu-deps \
dpkg \
gnupg \
openssl \
; \
\
dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')"; \
wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch"; \
wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch.asc"; \
\
# verify the signature
export GNUPGHOME="$(mktemp -d)"; \
gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4; \
gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu; \
rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc; \
\
chmod +x /usr/local/bin/gosu; \
# verify that the binary works
gosu nobody true; \
\
apk del .gosu-deps
RUN apk add --update iputils
RUN apk add --update htop
# COPY ./setup-slave.sh /docker-entrypoint-initdb.d
COPY ./docker-entrypoint.sh /docker-entrypoint.sh
RUN chmod +x /docker-entrypoint.sh
CMD ["gosu", "postgres", "pg_ctl", "-D/var/lib/postgresql/data", "start"]
这是我的 docker-entrypoint.sh:
#!/bin/bash
if [ ! -s "$PGDATA/PG_VERSION" ]; then
echo '*:*:*:myuser:123456' > ~/.pgpass
chmod 0600 ~/.pgpass
until ping -c 1 -W 1 pg_master
do
echo "Waiting for master to ping..."
sleep 1s
done
until pg_basebackup -h pg_master -D ${PGDATA} -U arioo -vP -W
do
echo "Waiting for master to connect..."
sleep 1s
done
echo "host replication all 0.0.0.0/0 md5" >> "$PGDATA/pg_hba.conf"
set -e
cat >> ${PGDATA}/postgresql.conf <<EOF
wal_level = hot_standby
max_wal_senders = 8
wal_keep_segments = 32
hot_standby = off
EOF
cat > ${PGDATA}/recovery.conf <<EOF
standby_mode = on
primary_conninfo = 'host=pg_master port=5432 user=rep password=123456'
trigger_file = '/tmp/touch_me_to_promote_to_me_master'
EOF
chown postgres. ${PGDATA} -R
chmod 700 ${PGDATA} -R
fi
exec "$@"
除了一件事,整个事情都很好。Docker 在启动时立即退出从容器。据我了解pg_ctl start
,应该在前台启动 postgres。但是为什么 docker 还在退出呢?
我docker-compose
用来运行集群。
我什至尝试在下面的代码末尾放置一个无限循环,docker-entrypoint.sh
无论我做什么,它仍然会退出:
while true; do
sleep 1s
done
解决方案
似乎运行postgres
而不是pg_ctl start
解决方案。pg_ctl
实际上是一个控制 postgres 守护进程的实用程序,因此它在后台运行 postgres 是合乎逻辑的。
推荐阅读
- excel - 使用 PasteSpecial 剪切/粘贴
- java - 如何将 SharedPreferences 数据从 settingActivity 传递到 MainAdapter?
- javascript - 如何根据 API 结果值更改 HTML 背景?
- python-3.x - 使用 bs4 遇到 Webscraping 问题
- node.js - RabbitMQ 消息应该直接从前端应用程序排队,还是先通过后端端点?
- python - 删除 90% 相似的重复推文
- python-3.x - 当我使用 Pyinstaller 时,Pycharm 会忽略安装的“Pyinstaller”模块,而是使用安装在 Windows 中的模块
- html - 如何从精灵图像中删除白色边框
- python - 在字典中列出的 csv 文件
- python - Python防止输入文本与其他文本分开