当前位置: 首页 > 知识库问答 >
问题:

带有postgresql和java的位桶管道Docker

皇甫乐
2023-03-14

我在设置docker映像时遇到了一些问题,该映像最终将用于bitbucket管道,以便为我从事的一些API项目运行测试。

我们本地开发人员的设置非常简单,在机器上运行Java 8 Maven PostgreSQL 9.6。

要运行集成测试,必须运行数据库。maven构建的一部分在服务器上创建必要的数据库和表。

我试图在docker映像上复制它,这是我到目前为止所拥有的。

FROM maven:3.5.3-jdk-8-slim

#Install postgresql
RUN apt update && \
    mkdir -p /usr/share/man/man1 &&\
    mkdir -p /usr/share/man/man7 &&\
    apt install -y postgresql-9.6

#Update config
RUN echo "host  all all 127.0.0.1/32  trust" >> /etc/postgresql/9.6/main/pg_hba.conf

#Start server
RUN service postgresql start

#Create readonly role for DB
USER postgres
RUN psql -c "CREATE ROLE readonly"

如果我通过first run在容器内手动运行这些步骤,则这些步骤似乎工作得很好:

docker run -it maven:3.5.3-jdk-8-slim /bin/bash

但当我尝试构建形象时,我得到的是:

▶ docker build -t pipelines .
Sending build context to Docker daemon  2.048kB
Step 1/6 : FROM maven:3.5.3-jdk-8-slim
 ---> 25f97112c73f
Step 2/6 : RUN apt update &&     mkdir -p /usr/share/man/man1 &&    mkdir -p /usr/share/man/man7 &&    apt install -y postgresql-9.6
 ---> Using cache
 ---> 5fa381f73c9d
Step 3/6 : RUN echo "host  all all 127.0.0.1/32  trust" >> /etc/postgresql/9.6/main/pg_hba.conf
 ---> Using cache
 ---> 0721966e7749
Step 4/6 : RUN service postgresql start
 ---> Using cache
 ---> 9ca8e7a270e0
Step 5/6 : USER postgres
 ---> Using cache
 ---> 50a99c6cac20
Step 6/6 : RUN psql -c "CREATE ROLE readonly"
 ---> Running in 572b2b8fa754
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 -c "CREATE ROLE readonly"' returned a non-zero code: 2

我读过一些关于这意味着容器试图访问主机上的端口,而不是容器的内容。但我无法理解手动运行命令和让Dockerfile“运行”命令之间的区别。

我还尝试过从postgres: 9.6基础映像构建它,然后安装java maven,但当我需要在DB上创建角色时,问题是一样的。

我在这里做错了一些事情,因为我的意图是在bitbucket管道上使用它。

共有1个答案

金珂
2023-03-14

在构建映像时使用RUN,例如安装后缀。每个RUN都在之前的RUN指令之上构建了一个层。

当您想默认执行命令时,当您运行映像(创建容器)时,请使用CMD。因此,当您在容器中运行该命令时,该命令相当于Dockerfile中的CMD

我建议使用一个脚本来运行您的命令,作为<code>入口点,<code>表,<code>插入测试数据 覆盖了以前的<code>命令。

docker文件中只能有一条CMD指令。如果您列出了多个CMD,则只有最后一个CMD会生效。

我也鼓励你阅读这个解释RUN、CMD和ENTRYPOINT的答案。

总结

RUN指令在映像构建期间实际运行命令

< code>CMD指令在构建时不执行,它在容器启动时执行,除非用户提供命令

 类似资料:
  • 问题内容: 有一种简单的方法可以将hibernate设置为对每个带有postgres的表使用不同的主键ID。我试图在数据源中使用postgres方言: 但这是行不通的。谢谢 问题答案: 简短的答案是没有,没有 简单的 方法可以做到这一点。但是,我找到了一种有效的解决方案。基本上,您需要实现自定义方言。这是一个实现(请在注释中注明实现的原始来源)。 上述实施应当存储为下你的Grails项目中。 接下

  • 问题内容: 我在PostgreSQL数据库中创建了一个函数,希望使用JPA 2.1的StoredProcedureQuery方法调用该函数。 这是我的PostgreSQL查询: 这只是一个简单的查询,可以计算特定日期的用户。这只是一个演示查询,用于测试StoredProcedureQueries的工作方式。实际上,当仅通过postgreSQL使用时,它就可以正常工作。 现在,让我们尝试使用JPA

  • 问题内容: 我已经使用Angular 2 CLI构建了Angular 2项目,并能够使用本教程将应用程序部署到Heroku 。 现在,我想为应用程序的不同环境(开发,登台,生产等)创建管道。 在我的package.json中,它将创建我的代码的生产版本,我的应用程序将在此版本上运行。有没有一种方法可以根据我在Heroku设置中的设置进行更改?例如,它将针对开发环境或登台环境。还是我需要以其他方式设

  • 在reactor Netty之前,我将创建Netty Tcp服务器的方式是创建服务器引导并添加我的自定义管道类。Reactor-Netty有tcpServer.create(),但似乎我必须创建一个新的函数接口,它接受NettyInbound和NettyOutbound并返回一个Mono。但是,如果我想添加一个构建管道的ChannelInitializer,我必须阻塞以获得NettyContext

  • 我正在编写一个脚本,它查询一些设备并将数据写入PostgreSQL数据库。

  • 问题内容: 在Go模板中,有时将正确的数据传递到正确的模板的方式令我感到尴尬。用流水线参数调用模板看起来就像只用一个参数调用函数。 假设我有一个Gophers网站,有关Gophers。它具有一个主页主模板和一个用于打印Gophers列表的实用程序模板。 http://play.golang.org/p/Jivy_WPh16 输出: 现在,我想在子模板中添加一些上下文:在列表内以不同的方式设置名称“