【问题标题】:Configure dockerfile with postgres使用 postgres 配置 dockerfile
【发布时间】:2016-05-02 05:08:53
【问题描述】:

尝试为我的应用程序所需的 postgres db 制作 Dockerfile。

Dockerfile

FROM postgres:9.4
RUN mkdir /sql
COPY src/main/resources/sql_scripts/* /sql/
RUN psql -f /sql/create_user.sql
RUN psql -U user -W 123 -f create_db.sql
RUN psql -U user -W 123 -d school_ats -f create_tables.sql

运行

docker build .

结果:

Sending build context to Docker daemon 3.367 MB
Step 1 : FROM postgres:9.4
 ---> 6196bca94565
Step 2 : RUN mkdir /sql
 ---> Using cache
 ---> 6f57c1e759b7
Step 3 : COPY src/main/resources/sql_scripts/* /sql/
 ---> Using cache
 ---> 3b496bfb28cd
Step 4 : RUN psql -a -f /sql/create_user.sql
 ---> Running in 33b2230a12fa
psql: could not connect to server: No such file or directory
    Is the server running locally and accepting
    connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
The command '/bin/sh -c psql -a -f /sql/create_user.sql' returned a non-zero code: 2

如何在 docker 中为我的项目指定 db?

【问题讨论】:

  • 基本 dockerfile postgres:9.4 在入口点启动之前实际上不会运行 postgres。你需要先从基础镜像启动容器。

标签: postgresql docker psql dockerfile


【解决方案1】:

在构建你的 docker 镜像时,postgres 没有运行。数据库在容器启动时启动,之后可以执行任何 sql 文件。最简单的解决方案是将你的 sql 文件放到特殊目录中:

FROM postgres:9.4
COPY *.sql /docker-entrypoint-initdb.d/

启动时启动脚本将执行此目录中的所有文件。您可以在文档https://hub.docker.com/_/postgres/ 中的如何扩展此图像部分阅读有关此内容。

另外,如果您需要不同的用户,您应该设置环境变量POSTGRES_USERPOSTGRES_PASSWORD。使用自定义脚本创建用户更容易。

【讨论】:

  • 根据最新的建议,我们应该更喜欢使用COPY 而不是ADD
【解决方案2】:

正如上面的评论所说,在图像构建期间,您没有得到正在运行的 Postgres 实例。

您可以采取稍微不同的方法。您可以将它们复制到/docker-entrypoint-initdb.d/ 目录,而不是尝试自己执行 SQL 脚本。它们将在容器启动时执行。

看看 postgres:9.4 镜像是如何构建的:

同样在你的 Dockerfile 中使用变量来设置数据库细节:

  • POSTGRES_DB
  • POSTGRES_USER
  • POSTGRES_PASSWORD

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-01
    • 2021-05-24
    • 1970-01-01
    • 2022-07-05
    • 2015-06-08
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多