【问题标题】:Postgres Docker container: Run command on startupPostgres Docker 容器:启动时运行命令
【发布时间】:2018-02-22 07:06:40
【问题描述】:

我有以下 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

第三方应用程序启动.sh:

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

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

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

有没有更好的方法来做到这一点?
或者有没有办法获取该命令出错的详细错误日志?

【问题讨论】:

标签: postgresql shell docker dockerfile


【解决方案1】:

容器的主要运行进程是 ENTRYPOINT 和/或 CMD Dockerfile 的结尾。一般建议分开 每个容器使用一项服务。该服务可能 分叉成多个进程(例如,Apache Web 服务器启动 多个工作进程)。可以有多个进程,但要 从 Docker 中获得最大收益,避免一个容器被 负责整个应用程序的多个方面。你可以 使用用户定义的网络连接多个容器并共享 卷。

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

【讨论】:

  • 或将服务拆分成多个容器
  • 我尝试了包装脚本,但容器在启动时仍然崩溃,状态码为 127。而且我在容器中找不到任何启动日志来找出问题所在。
猜你喜欢
  • 1970-01-01
  • 2023-03-09
  • 2019-05-21
  • 1970-01-01
  • 2022-11-10
  • 2019-03-11
  • 2020-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多