Docker Postgres并非从构建开始

时间:2018-09-25 08:26:51

标签: 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容器并手动执行此步骤,则一切正常。

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

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

尽管如此,只是让您知道,Dockerfile中的问题是在RUN语句中启动服务是无用的。对于Dockerfile中的每一行,docker都会创建一个新映像。例如RUN service postgresql start,它可能会在docker构建期间启动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命令中的引号可能有问题)

答案 1 :(得分:0)

我在war文件的问题帽子中有硬编码的数据库war的本地主机。 感谢Light.G,他建议我对容器使用--net = host,所以现在有一个容器用于数据库,一个容器用于tomcat服务器。

这是我遵循的步骤。

构建docker映像

docker build -t $USER/App .

启动一个postgres数据库

我们正在使用主机名称空间,因此无法在5432上运行另一个程序。
像这样启动postgres容器:
docker run -it --rm --net=host -e POSTGRES_USER='springuser' -e POSTGRES_DB='db_example' -e POSTGRES_PASSWORD='test123' postgres

启动tomcat

使用以下命令启动App容器:
docker run -it --net=host --rm $USER/App