等待服务postgres启动dockerfile

时间:2019-11-06 03:59:52

标签: postgresql docker

我正在使用docker文件构建ubuntu映像,并已安装postgresql。但是我等不及服务postgres的状态了

FROM ubuntu:18.04
....
RUN apt-get update && apt-get install -y postgresql-11
RUN service postgresql start
RUN su postgres
RUN psql
RUN CREATE USER kong; CREATE DATABASE kong OWNER kong;
RUN \q
RUN exit

一切似乎都不错,但是RUN su postgres会引发错误,因为RUN service postgresql start之后尚未启动服务postgresql。我该怎么办?

1 个答案:

答案 0 :(得分:2)

首先,Dockerfile中的每个RUN命令都在单独的外壳中运行,RUN命令应用于starting进程的安装或配置。该过程应从CMDentrypoint开始。

RUN vs CMD

最好使用官方postgress docker image

docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d postgres

默认的postgres用户和数据库是在initdb的入口点中创建的。 或者您也可以基于Postgress建立图像。

FROM postgres:11
ENV POSTGRES_USER=kong
ENV POSTGRES_PASSWORD=example
COPY seed.sql /docker-entrypoint-initdb.d/seed.sql

这将创建一个带有用户名,密码的图像,并且入口点还将在容器启动时插入种子数据。

POSTGRES_USER

  

此可选环境变量与   POSTGRES_PASSWORD设置用户及其密码。此变量将   使用超级用户权限创建指定的用户,并使用   一样的名字。如果未指定,则为postgres的默认用户   将被使用。

官方docker映像的一些优势

  • 从ENV创建数据库
  • 从ENV创建数据库用户
  • 从种子数据开始容器
  • 将等待postgres启动并运行

所有你需要的

# Use postgres/example user/password credentials
version: '3.1'

services:

  db:
    image: postgres
    restart: always
    environment:
      POSTGRES_PASSWORD: example

初始化脚本

  

如果您想对派生的图像进行其他初始化   在这一项中,在下面添加一个或多个*.sql, *.sql.gz, or *.sh脚本   /docker-entrypoint-initdb.d(必要时创建目录)。   在入口点调用initdb之后,创建默认的postgres用户   和数据库,它将运行任何*.sql文件,运行任何可执行文件* .sh   脚本,并在其中找到任何不可执行的*.sh脚本   目录以在启动服务之前进行进一步的初始化。