使用 Postgresql 对 Spring Boot 应用程序进行 Dockerizing

Posted

技术标签:

【中文标题】使用 Postgresql 对 Spring Boot 应用程序进行 Dockerizing【英文标题】:Dockerizing Spring Boot App with Postgresql 【发布时间】:2016-07-13 00:06:09 【问题描述】:

我正在尝试为使用 PostgreSQL 作为数据库的 Spring Boot 应用程序创建一个 Docker 容器。我的目标是构建一个运行应用程序以及 PostgreSQL 的容器。我创建了一个 Dockerfile 如下:

FROM ubuntu:15.10
LABEL version="1"

ADD app.jar app.jar
RUN bash -c 'touch /app.jar'

#  Install Java, Postgresql
......

USER postgres
RUN /etc/init.d/postgresql start &&\
    psql --command "CREATE USER test WITH SUPERUSER PASSWORD 'test';" &&\
        createdb -O test test

USER root
RUN echo "local all all trust" >> /etc/postgresql/9.4/main/pg_hba.conf
RUN echo "listen_addresses='127.0.0.1'" >> /etc/postgresql/9.4/main/postgresql.conf
RUN echo "localhost vspyfe-db" >> /etc/hosts
#Define working directory.
WORKDIR /data
# Add VOLUMEs to allow backup of config, logs and databases
VOLUME  ["/tmp", "/etc/postgresql", "/var/log/postgresql", "/var/lib/postgresql"]

# Define commonly used JAVA_HOME variable
ENV JAVA_HOME /usr/lib/jvm/java-8-oracle
COPY ./entrypoint.sh /
RUN chmod +x /entrypoint.sh
ENTRYPOINT  ["/entrypoint.sh"]
CMD ["bash", "/usr/lib/postgresql/9.4/bin/postgres", "-D", "/var/lib/postgresql/9.4/main", "-c", "config_file=/etc/postgresql/9.4/main/postgresql.conf"]

entrypoint.sh 是:

#!/bin/sh
/etc/init.d/postgresql start
java -Djava.security.egd=file:/dev/./urandom -jar /app.jar

我使用此命令docker build --rm=true -t vspyfe/base:v1 . 构建,并且 当我用这个命令docker run -i -t vspyfe/base:v1 运行图像时,我得到了异常,上面写着

Caused by: org.postgresql.util.PSQLException: FATAL: role "test" does not exist
at org.postgresql.core.v3.ConnectionFactoryImpl.readStartupMessages(ConnectionFactoryImpl.java:471)
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:112)
at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:66)
at org.postgresql.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:125)
at org.postgresql.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:30)
at org.postgresql.jdbc3g.AbstractJdbc3gConnection.<init>(AbstractJdbc3gConnection.java:22)
at org.postgresql.jdbc4.AbstractJdbc4Connection.<init>(AbstractJdbc4Connection.java:32)
at org.postgresql.jdbc4.Jdbc4Connection.<init>(Jdbc4Connection.java:24)
at org.postgresql.Driver.makeConnection(Driver.java:393)
at org.postgresql.Driver.connect(Driver.java:267)

即使我尝试使用默认用户名和密码(postgres、postgres)创建测试数据库,也会收到异常说测试数据库不存在。我不明白我在哪里做错了。在 Dockerfile 中,我指定了我在 application.properties 文件中使用的每个参数。

【问题讨论】:

【参考方案1】:

您是否检查过您的连接属性?我有一个与 postgres 配合得很好的 spring-boot 应用程序的工作示例。两者都在不同的容器中运行。请参考:

Spring Boot + Postgres example, using the fabric8.io plugin

运行示例:

mvn clean package -DskipTests docker:stop docker:build docker:run

【讨论】:

以上是关于使用 Postgresql 对 Spring Boot 应用程序进行 Dockerizing的主要内容,如果未能解决你的问题,请参考以下文章

将从 spring-boot 检索到的数据转换为 JSON 并在 Angular 前端获取它

自定义spring-boot-autocofigure使用maven打包的时候报错了:Failed to execute goal org.springframework.boot:spring-bo

easy-rules-centraldogma-spring-boot-starter 引入外部rule

404-not-found-while-running-spring-boot-rest-api

Spring Data JPA:如何对 RDS Aurora PostgreSQL 实例之间的读取查询进行负载平衡?

Angular、Spring Boot 和 PostgreSQL 项目需要哪些 AWS 服务? [关闭]