Docker postgres 不在构建时启动
Docker postgres doesn't start at build
我想使用 docker 容器来模拟我的生产环境,所以我将数据库和服务器安装在同一个容器中,而不是各自安装。
这是我的docker文件:
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 中的问题是在 运行 语句中启动服务是无用的。对于 Dockerfile 中的每一行,docker 创建一个新图像。例如 RUN service postgresql start
,它可能会在 docker 构建期间启动 postgresql,但它不会保留在最终映像中。只有文件系统从一个步骤持续到另一个步骤,而不是进程。
每个进程都需要在入口点启动,这是执行时调用的唯一命令 docker 运行:
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命令的引号可能有问题)
我在 war 文件中遇到问题,数据库 war 的本地主机已硬编码。
感谢 Light.G,他建议我使用 --net=host 作为容器,所以现在有一个容器带有数据库,一个带有 tomcat 服务器。
这是我遵循的步骤。
构建 docker 图像
docker build -t $USER/App .
启动一个postgres 数据库
我们正在使用主机命名空间,无法 运行 post 5432 上的另一个程序。
像这样启动 postgres 容器:
docker run -it --rm --net=host -e POSTGRES_USER='springuser' -e POSTGRES_DB='db_example' -e POSTGRES_PASSWORD='test123' postgres
开始tomcat
启动应用程序容器,使用以下命令:
docker run -it --net=host --rm $USER/App
我想使用 docker 容器来模拟我的生产环境,所以我将数据库和服务器安装在同一个容器中,而不是各自安装。
这是我的docker文件:
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 中的问题是在 运行 语句中启动服务是无用的。对于 Dockerfile 中的每一行,docker 创建一个新图像。例如 RUN service postgresql start
,它可能会在 docker 构建期间启动 postgresql,但它不会保留在最终映像中。只有文件系统从一个步骤持续到另一个步骤,而不是进程。
每个进程都需要在入口点启动,这是执行时调用的唯一命令 docker 运行:
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命令的引号可能有问题)
我在 war 文件中遇到问题,数据库 war 的本地主机已硬编码。
感谢 Light.G,他建议我使用 --net=host 作为容器,所以现在有一个容器带有数据库,一个带有 tomcat 服务器。
这是我遵循的步骤。
构建 docker 图像
docker build -t $USER/App .
启动一个postgres 数据库
我们正在使用主机命名空间,无法 运行 post 5432 上的另一个程序。
像这样启动 postgres 容器:
docker run -it --rm --net=host -e POSTGRES_USER='springuser' -e POSTGRES_DB='db_example' -e POSTGRES_PASSWORD='test123' postgres
开始tomcat
启动应用程序容器,使用以下命令:
docker run -it --net=host --rm $USER/App