java - 用于 bitbucket 管道的带有 postgresql 和 java 的 Docker

标签 java postgresql docker bitbucket-pipelines docker-image

我在设置 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"

如果我通过第一次运行在容器内手动运行这些步骤,它们似乎工作得很好:

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 但是当我需要在数据库上创建角色时,问题是一样的。

鉴于我的意图是在 bitbucket 管道上使用它,我在这里做错了什么。

最佳答案

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

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

我建议使用一个脚本来运行你的命令作为一个 ENTRYPOINTcreate roles, tables, insert test data... 在 Dockerfile 中,您通常有多个构建在最后一层之上的 RUN 指令,但是 CMDoverrides以前的 CMD 指令。

There can only be one CMD instruction in a Dockerfile. If you list more than one CMD then only the last CMD will take effect.

我也鼓励您阅读 this答案解释RUN , CMDENTRYPOINT .

总结

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

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

关于java - 用于 bitbucket 管道的带有 postgresql 和 java 的 Docker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50844678/

相关文章:

python - 在我的 Windows 10 上安装 PostgreSQL 13 时出现问题,在运行 pgAdmin4 时出现 fatal error : "The pgAdmin 4 server could not be contacted:"

postgresql - 默认情况下以只读事务启动 psql

docker - 一个小的 Docker 镜像在运行时有多重要?

docker-compose 运行任何命令都会出错

python - 如何更快地构建Docker镜像

java - 为什么要避免在 Java 中大量使用 ByteStream

java - 使用新的 Java 8 Streams API 解析 CSV 文件中的多行行

postgresql - Postgres regr_slope 返回 NULL

java - 为什么这些接口(interface)类型的变量不用于实例化新对象?

java - 如何防止 TableModel 触发表更改事件?