我想使用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容器并手动执行此步骤,则一切正常。
感谢您的帮助
答案 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 build -t $USER/App .
我们正在使用主机名称空间,因此无法在5432上运行另一个程序。
像这样启动postgres容器:
docker run -it --rm --net=host -e POSTGRES_USER='springuser' -e POSTGRES_DB='db_example' -e POSTGRES_PASSWORD='test123' postgres
使用以下命令启动App容器:
docker run -it --net=host --rm $USER/App