Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker与postgresql和java一起用于bitbucket管道_Java_Postgresql_Docker_Bitbucket Pipelines_Docker Image - Fatal编程技术网

Docker与postgresql和java一起用于bitbucket管道

Docker与postgresql和java一起用于bitbucket管道,java,postgresql,docker,bitbucket-pipelines,docker-image,Java,Postgresql,Docker,Bitbucket Pipelines,Docker Image,我在设置docker映像时遇到了一些问题,最终将在bitbucket管道上使用docker映像来运行我所处理的一些API项目的测试 本地开发人员的设置非常简单,Java 8+Maven+PostgreSQL 9.6在机器上运行 要运行集成测试,必须运行数据库。maven构建的一部分在服务器上创建了必要的数据库和表 我试着在docker图像上复制这一点,这就是我目前所拥有的 FROM maven:3.5.3-jdk-8-slim #Install postgresql RUN apt updat

我在设置docker映像时遇到了一些问题,最终将在bitbucket管道上使用docker映像来运行我所处理的一些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
base映像构建它,然后安装java+maven,但是当我需要在DB上创建角色时,问题是相同的


考虑到我的意图是在bitbucket管道上使用它,我在这里做错了一些事情

在构建映像时使用
RUN
,例如安装postgress。每次
运行
都会在前面的
运行
指令的基础上构建一个层

在运行映像(创建容器)时,如果希望在默认情况下执行命令,请使用
CMD
。因此,当您在容器中运行该命令时,它将相当于Dockerfile中的
CMD

我建议使用一个脚本,将您的命令作为
入口点运行,该入口点将
创建角色
表格
插入测试数据
。。。在Dockerfile中,通常会有多条
运行
指令构建在最后一层之上,但
CMD
会覆盖先前的
CMD
指令

Dockerfile中只能有一条CMD指令。如果你列出 多个命令,则只有最后一个命令生效

我也鼓励你们阅读答案解释,和

摘要

RUN
指令在生成映像期间实际运行该命令


CMD
指令在构建时不执行,它在容器启动时执行,除非用户提供了一个命令

!谢谢我会考虑合并脚本,一旦我有了一些工作,然后我会考虑清理