我有以下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手动执行命令时,它可以正常工作。
有没有更好的方法来实现这一目标? 或者有没有办法获得该命令出错的详细错误日志?
答案 0 :(得分:0)
容器的主要运行过程是ENTRYPOINT和/或CMD Dockerfile的结尾。通常建议您分开 每个容器使用一个服务的关注领域。那项服务可能 分叉到多个进程(例如,Apache Web服务器启动 多个工人流程)。可以有多个进程,但是 从Docker中获取最大的好处,避免使用一个容器 负责整个应用程序的多个方面。您可以 使用用户定义的网络连接多个容器并共享 卷。
为了实现您的目标,您需要使用包装脚本或主管,更多详细信息:https://docs.docker.com/config/containers/multi-service_container/