postgresql - Docker postgres 不会从构建开始

标签 postgresql docker dockerfile postgresql-9.6

我想使用 docker 容器来模拟我的生产环境,所以我将数据库和服务器安装在同一个容器中,而不是各自安装。

这是我的 dockerfile:

FROM debian
RUN apt update
RUN apt install postgresql-9.6 tomcat8 tomcat8-admin -y
RUN service postgresql start
RUN service postgresql status # says postgres is down
RUN su - postgres ;
RUN createdb db_example # fails !!!
RUN psql -c "CREATE USER springuser WITH PASSWORD 'test123';"
RUN exit
RUN service tomcat8 start

COPY target/App-1.0.war /var/lib/tomcat8/webapps/

CMD ["/bin/bash"]

问题是数据库已关闭,所以我无法创建用户和数据库。
如果我启动 debian docker 容器并手动执行此步骤,一切正常。

谢谢你的帮助

最佳答案

评论中的所有建议都是正确的,最好将服务放在不同的容器中。

尽管如此,只是想让您知道,Dockerfile 中的问题是在 RUN 语句中启动服务是无用的。对于 Dockerfile 中的每一行,docker 都会创建一个新图像。例如 RUN service postgresql start,它可能会在 docker build 期间启动 postgresql,但它不会保留在最终图像中。只有文件系统从一个步骤持续到另一个步骤,而不是进程。

每个进程都需要在入口点启动,这是执行 docker run 时调用的唯一命令:

FROM debian
RUN apt update
RUN apt install postgresql-9.6 tomcat8 tomcat8-admin -y

COPY target/App-1.0.war /var/lib/tomcat8/webapps/

ENTRYPOINT["/bin/bash", "-c", "service postgresql start && service postgresql status && createdb db_example && psql -c \"CREATE USER springuser WITH PASSWORD 'test123';\" && service tomcat8 start && sleep infinity"]

(psql命令的引号可能有问题)

关于postgresql - Docker postgres 不会从构建开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52493726/

相关文章:

angularjs - 不区分大小写的环回过滤器

sql - 字符串匹配的多列索引+与pg_trgm的字符串相似性?

postgresql - 修改postgresql中的UNIQUE

postgresql - DBeaver 只能看到连接中的默认 PostgreSQL 数据库

bash - 如何在每个 "exec"命令处执行 Docker 镜像的入口点?

docker - Jekyll 站点在 docker 容器内运行,但 localhost 为 :4000 is not working on host

docker - 根据分配的端口停止并删除Docker容器

docker - 如何在Mac OS X中启用Docker远程api?

docker - 如何使用 kubernetes 启动停止的容器?

docker - 拉取源代码并在 docker 镜像中使用它的最佳实践