首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Docker with postgresql和java for bitbucket pipelines

Docker with postgresql和java for bitbucket pipelines
EN

Stack Overflow用户
提问于 2018-06-14 03:15:32
回答 1查看 655关注 0票数 1

我在设置docker镜像时遇到了一些问题,该镜像最终将在bitbucket管道上用于为我工作的一些API项目运行测试。

我们本地开发人员的设置非常简单,在机器上运行Java8+ 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管道上使用它,我在这里做错了一些事情。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-14 03:54:27

在构建镜像时使用RUN,例如安装postgress。每个RUN在前面的RUN指令之上构建一个层。

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

我建议使用一个脚本,它可以将您的命令作为一个ENTRYPOINT来运行,该脚本可以是create rolestablesinsert test data……在一个Dockerfile文件中,你通常有多个构建在最后一层之上的RUN指令,但是CMDoverrides之前的CMD指令。

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

我也鼓励你阅读this answer解释RUNCMDENTRYPOINT

摘要

RUN指令实际上在映像构建过程中运行该命令

在构建时不执行CMD指令,除非用户提供命令,否则在容器启动时执行

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50844678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档