postgresql docker alpine linux 容器中的 Postgres

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/46981073/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-21 02:39:34  来源:igfitidea点击:

Postgres in docker alpine linux container

postgresqldockeralpine

提问by ingvar

I'm trying to get postgres 10.0 working in docker container. I have following Dockerfile:

我正在尝试让 postgres 10.0 在 docker 容器中工作。我有以下 Dockerfile:

FROM postgres:10.0-alpine

RUN apk add openrc --no-cache

USER postgres

RUN /etc/init.d/postgresql start
RUN psql --command "IF NOT EXISTS (SELECT FROM pg_catalog.pg_user WHERE usename = 'user') THEN CREATE USER user WITH SUPERUSER ENCRYPTED PASSWORD 'password'; END IF;"
RUN createdb main

EXPOSE 5432

VOLUME  ["/etc/postgresql", "/var/log/postgresql", "/var/lib/postgresql"]

CMD ["/usr/lib/postgresql/10.0/bin/postgres", "-D", "/var/lib/postgresql/10.0/main", "-c", "config_file=/etc/postgresql/10.0/main/postgresql.conf"]

I got following error:

我收到以下错误:

/bin/sh: /etc/init.d/postgresql: not found

Seems that /etc/init.d/postgresqlis really missing. What am I doing wrong?

看来/etc/init.d/postgresql真的少了。我究竟做错了什么?

回答by ingvar

I finished with this Dockerfile:

我完成了这个 Dockerfile:

FROM postgres:10.0-alpine

USER postgres

RUN chmod 0700 /var/lib/postgresql/data &&\
    initdb /var/lib/postgresql/data &&\
    echo "host all  all    0.0.0.0/0  md5" >> /var/lib/postgresql/data/pg_hba.conf &&\
    echo "listen_addresses='*'" >> /var/lib/postgresql/data/postgresql.conf &&\
    pg_ctl start &&\
    psql -U postgres -tc "SELECT 1 FROM pg_database WHERE datname = 'main'" | grep -q 1 || psql -U postgres -c "CREATE DATABASE main" &&\
    psql --command "ALTER USER postgres WITH ENCRYPTED PASSWORD 'mysecurepassword';"

EXPOSE 5432

This dockerfile create database 'main' (if not exists), starts postgres and sets default user password

此 dockerfile 创建数据库“main”(如果不存在),启动 postgres 并设置默认用户密码

回答by radtek

I was able to do it using exec commands, so I can run postgres in a running container, in this case alpine 3.7. Note $CONTAINER_NAMEis the container id from docker ps:

我能够使用 exec 命令来完成它,所以我可以在正在运行的容器中运行 postgres,在这种情况下是 alpine 3.7。注意$CONTAINER_NAME是来自docker ps以下位置的容器 ID :

# Install postgresql, create user, db & start the daemon (for testing)
sudo docker exec $CONTAINER_NAME sh -c 'apk add postgresql'
sudo docker exec $CONTAINER_NAME  sh -c 'addgroup -S postgres && adduser -S postgres -G postgres'
sudo docker exec $CONTAINER_NAME sh -c 'mkdir -p /var/lib/postgresql/data'
sudo docker exec $CONTAINER_NAME sh -c 'mkdir -p /run/postgresql/'
sudo docker exec $CONTAINER_NAME sh -c 'chown -R postgres:postgres /run/postgresql/'
sudo docker exec $CONTAINER_NAME sh -c 'chmod -R 777 /var/lib/postgresql/data'
sudo docker exec $CONTAINER_NAME sh -c 'chown -R postgres:postgres /var/lib/postgresql/data'
sudo docker exec --user postgres $CONTAINER_NAME sh -c 'initdb /var/lib/postgresql/data'
sudo docker exec --user postgres $CONTAINER_NAME sh -c 'echo "host all  all    0.0.0.0/0  md5" >> /var/lib/postgresql/data/pg_hba.conf'
sudo docker exec --user postgres $CONTAINER_NAME  sh -c 'pg_ctl start -D /var/lib/postgresql/data -l /var/lib/postgresql/log.log'
sudo docker exec --user postgres $CONTAINER_NAME sh -c "psql --command \"ALTER USER postgres WITH ENCRYPTED PASSWORD 'buildpgpass';\""
sudo docker exec --user postgres $CONTAINER_NAME sh -c "psql --command \"CREATE DATABASE builddb;\""

You can also include this in your Dockerfile like so:

您还可以将其包含在您的 Dockerfile 中,如下所示:

# Postgres
RUN apk add postgresql=11.1-r0
RUN (addgroup -S postgres && adduser -S postgres -G postgres || true)
RUN mkdir -p /var/lib/postgresql/data
RUN mkdir -p /run/postgresql/
RUN chown -R postgres:postgres /run/postgresql/
RUN chmod -R 777 /var/lib/postgresql/data
RUN chown -R postgres:postgres /var/lib/postgresql/data
RUN su - postgres -c "initdb /var/lib/postgresql/data"
RUN echo "host all  all    0.0.0.0/0  md5" >> /var/lib/postgresql/data/pg_hba.conf
RUN su - postgres -c "pg_ctl start -D /var/lib/postgresql/data -l /var/lib/postgresql/log.log && psql --command \"ALTER USER postgres WITH ENCRYPTED PASSWORD 'postgres';\" && psql --command \"CREATE DATABASE builddb;\""

This seems to work great if you want to test something out on the fly.

如果您想即时测试某些内容,这似乎很有效。

回答by yamenk

There are many problems with you dockerfile. I guess you are trying to start the server when building the image to create the main database. This won't work since each command in the dockefile will execute in its own layer, and thus when you reach RUN psql ...the database won't be started since it was started in a different layer. So you need to group the commands in one line.

你的 dockerfile 有很多问题。我猜您在构建图像以创建主数据库时正试图启动服务器。这是行不通的,因为 dockefile 中的每个命令都将在其自己的层中执行,因此当您到达RUN psql ...数据库时将不会启动,因为它是在不同的层中启动的。因此,您需要将命令分组在一行中。

Second problem, is the file /etc/init.d/postgresqldoes not exist. The server can be started using the postgres command.

第二个问题,是文件/etc/init.d/postgresql不存在。可以使用 postgres 命令启动服务器。

RUN postgres &\
 psql --command "IF NOT EXISTS (SELECT FROM pg_catalog.pg_user WHERE usename = 'user')\
 THEN CREATE USER user WITH SUPERUSER ENCRYPTED PASSWORD 'password'; END IF;" &\
 createdb main