San*_*idi 1 postgresql archlinux docker docker-compose
我有以下 docker-compose 文件:
version: '3'
services:
web:
build:
context: ./django_httpd_mod_wsgi
ports:
- "8000:80"
db:
build:
context: ./postgresql
volumes:
- db-data:/var/lib/postgres/data
volumes:
db-data:
Run Code Online (Sandbox Code Playgroud)
我正在使用 archlinux 构建 psotgresql 映像:
以下是我的 postgresql Dockerfile:
FROM archlinux/base
RUN yes | pacman -S postgresql
RUN mkdir /run/postgresql/
RUN chown -R postgres:postgres /run/postgresql/
USER postgres
RUN initdb -D /var/lib/postgres/data
RUN psql -c 'CREATE DATABASE btgapp;'
RUN psql -c "CREATE USER simha WITH PASSWORD 'krishna';"
RUN psql -c 'GRANT ALL PRIVILEGES ON DATABASE btgapp TO simha;'
CMD ["/usr/bin/postgres","-D","/var/lib/postgres/data"]
Run Code Online (Sandbox Code Playgroud)
当我尝试做:
docker-compose up
Run Code Online (Sandbox Code Playgroud)
我收到错误:
psql: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/run/postgresql/.s.PGSQL.5432"?
ERROR: Service 'db' failed to build: The command '/bin/sh -c psql -c 'CREATE DATABASE dbname;'' returned a non-zero code: 2
Run Code Online (Sandbox Code Playgroud)
我知道我必须psql -c CREATE DATABSE "dbname"在启动 postgresql 服务器后运行/usr/bin/postgres -D /var/lib/postgres/data
但是我无法在 Dockerfile 中启动多个命令。那么如何做到这一点。
选项是启动脚本。但是,很难看到 postgres 作为单个进程运行。
根据评论,我会在这里尝试回答。
我相信您应该使用 postgres 11-alpine 图像。我将在这里尝试解释原因。
官方 docker 镜像有很多好处,您在开始自己的镜像之前应该始终考虑这些好处。
debian和alpine基于图像。该alpine图像是较小的一个,而debian稍大,但给你获得了广大Debian软件包库,如果你需要安装额外的软件包。README.md将涵盖常见的用例。我发现这些说明值得从上到下仔细阅读。我知道您想保持图像较小,但您知道什么 - postgres 项目已经涵盖了您的用例。
最新标记的 alpine postgres 图像11-alpine的压缩空间为28 MB,解压缩为70MB。虽然archlinux/base要与已压缩的基础足迹开始像153MB和的解压缩大小445MB。那是在您介绍 postgres 本身之前。
除此之外,您想要在启动时创建的数据库和用户 - 可以单独在官方 postgres 映像的环境变量中处理。像这样:
docker run -d --name some-postgres \
-e POSTGRES_PASSWORD=mysecretpassword \
-e POSTGRES_USER=simha \
-e POSTGRES_DB=btgapp \
postgres:11-alpine
Run Code Online (Sandbox Code Playgroud)
如果这不包括您的数据库所需的初始化,那么您可以将.sql脚本(和.sh脚本)复制到映像中的特殊位置 - 它们将在启动时执行。为此,您可以像这样扩展他们的图像:
init-user-db.sh
#!/bin/bash
set -e
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
CREATE USER simha;
CREATE DATABASE btgapp;
GRANT ALL PRIVILEGES ON DATABASE btgapp TO simha;
EOSQL
Run Code Online (Sandbox Code Playgroud)
然后Dockerfile像这样:
Dockerfile
FROM postgres:11-alpine
COPY ./init-user-db.sh /docker-entrypoint-initdb.d/init-user-db.sh
Run Code Online (Sandbox Code Playgroud)
(这取自docker hub 上的 postgres 描述)
最后 - 我建议您不要将图像所基于的发行版置于可用性和可维护性之上。Docker 使我们能够在容器中运行应用程序,而无需过多关心容器内的发行版。反正都是linux。归根结底,我希望您像我一样需要一个稳定的 postgres 数据库容器。这就是我从官方 postgres 图像中得到的。
我希望我能帮助你评估你在这方面的选择。
| 归档时间: |
|
| 查看次数: |
5100 次 |
| 最近记录: |