Docker与postgresql和java一起用于bitbucket管道
我在设置docker映像时遇到了一些问题,最终将在bitbucket管道上使用docker映像来运行我所处理的一些API项目的测试 本地开发人员的设置非常简单,Java 8+Maven+PostgreSQL 9.6在机器上运行 要运行集成测试,必须运行数据库。maven构建的一部分在服务器上创建了必要的数据库和表 我试着在docker图像上复制这一点,这就是我目前所拥有的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
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
指令在构建时不执行,它在容器启动时执行,除非用户提供了一个命令!谢谢我会考虑合并脚本,一旦我有了一些工作,然后我会考虑清理