在一个用于CI(Bamboo)的容器中运行postgres 9.5和django

时间:2019-05-22 13:10:02

标签: django postgresql docker continuous-integration bamboo

我正在尝试在Bamboo上为Django应用配置CI作业,要运行的测试依赖于数据库(postgres 9.5)。看来,谨慎的方法是在docker容器中运行整个测试,因为我无法控制代理环境,因此无法在此处安装Postgres。

我发现大多数指南都建议在两个单独的容器中运行postgres和django,并使用docker-compose轻松管理它们。在这种情况下,每个docker映像仅运行一项服务,以CMD开始。但是,在Bamboo中,我不能使用docker-compose,我只需要使用一个映像,因此我试图使Postgres和Django在一个容器中很好地运行,但到目前为止收效甚微。

我的问题是,我没有简单的方法在Docker内部将Postgres作为服务启动,而不是作为docker CMD命令启动,官方postgre image使用entrypoint.sh方法(也介绍了此方法)在官方docker docs中 但是我不清楚如何实现这一点。感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

您唯一的其他选择是在Dockerfile中添加启动脚本,或将其作为docker run ...命令的一部分启动。我们通常不使用“ Docker”任务,因为我发现它们... 令人讨厌(这也是为什么我通常只回到运行“ Script”任务并直接调用{{1} }在该脚本任务中)

无论如何,您必须让Docker容器执行一个脚本,该脚本将:

  1. 启动Postgres(如docker run
  2. 执行测试。

您的sudo systemctl start postgresql将必须安装Postgresql并做一些我想像的较小的设置工作(例如使用适当的所有者创建相关的用户和数据库)。既然我们都是好公民,我们记得永远不要以root身份运行您的容器,对吗?

请注意-您始终可以在不使用Dockerfile的情况下设法使两个容器相互通信。不太方便,但是您可以执行以下操作:

docker-compose

请确保您将Postgresql映像上的正确端口docker run --detach --cidfile=db_cidfile --name ci_db postgresql_image ... docker run --link ci_db testing_image 连接到EXPOSE容器。

答案 1 :(得分:0)

好吧,基本上,您将在docker-entrypoint shell脚本中将postgres作为后台进程启动,否则将启动django应用程序。

这里唯一的窍门是,您需要在其中添加一个“ trap”命令,以便在主进程停止时可以向后台进程发送关闭/ kill。

尽管我已经做过一千遍了,但我知道它是编程错误的良好来源。通常,我只使用docker-systemctl-replacement来处理将多个应用程序作为服务运行,就像容器是承载多个应用程序的虚拟机一样。