我想使用 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/