Postgres Docker容器:启动时运行命令

时间:2018-02-22 07:06:41

标签: postgresql shell docker dockerfile

我有以下Dockerfile来创建一个带有第三方应用程序的Postgres容器:

FROM postgres

COPY ./setup/third-party-app.deb /opt/third-party-app.deb
COPY ./setup/init_extensions-db.sql /docker-entrypoint-initdb.d/init_extensions-db.sql

RUN apt-get update -y
RUN apt-get install -y default-jre-headless
RUN dpkg -i /opt/third-party-app.deb
RUN service third-party-app init
RUN service third-party-app start

但是我注意到service third-party-app start在构建阶段成功执行,但是在正在运行的容器中没有启动服务。
我认为原因是Docker镜像不会对正在运行的进程进行快照。 所以我试图在容器启动后找到一种自动执行此命令的方法。

我尝试在Dockerfile的末尾跟随代码:

CMD postgres && service third-party-app start

但是容器以错误状态代码1退出。

我还尝试将以下shell脚本复制到Postgres图像的docker-entrypoint-initdb.d中:

COPY ./setup/third-party-app-start.sh /docker-entrypoint-initdb.d/third-party-app-start.sh

third-party-app-start.sh:

#!/bin/bash
set -e
service third-party-app start

但同样的事情发生了。容器以错误状态代码1退出。

但是当我在容器启动后通过PowerShell手动执行命令时,它可以正常工作。

有没有更好的方法来实现这一目标? 或者有没有办法获得该命令出错的详细错误日志?

1 个答案:

答案 0 :(得分:0)

  

容器的主要运行过程是ENTRYPOINT和/或CMD   Dockerfile的结尾。通常建议您分开   每个容器使用一个服务的关注领域。那项服务可能   分叉到多个进程(例如,Apache Web服务器启动   多个工人流程)。可以有多个进程,但是   从Docker中获取最大的好处,避免使用一个容器   负责整个应用程序的多个方面。您可以   使用用户定义的网络连接多个容器并共享   卷。

为了实现您的目标,您需要使用包装脚本或主管,更多详细信息:https://docs.docker.com/config/containers/multi-service_container/