在jenkins构建中使用docker镜像并启动后台服务

时间:2018-05-24 03:52:31

标签: docker jenkins dockerfile jenkins-pipeline

我正在Jenkins中建立一个构建版本,并且我正在使用docker镜像来完成这项工作。

当容器为作业运行时,我需要在后台的容器中启动服务(postgresql),然后继续工作。

我无法弄清楚如何启动服务并让容器保持运行,为以下命令做好准备。

在我的dockerfile中,我目前有

FROM php:5.6
RUN apt-get update && apt-get install -y \
      unzip \
      git \
      libpq-dev \
      libzip-dev \
      sudo \
      postgresql && \
  docker-php-ext-install \
      pdo_pgsql \
      zip

USER postgres
RUN /etc/init.d/postgresql start && \
      psql -c "CREATE USER blah WITH SUPERUSER PASSWORD 'blahblah';" && \
      createdb -O blah blahblahblah

USER root

COPY docker-entrypoint.sh .

ENTRYPOINT ["/docker-entrypoint.sh"]

docker-entrypoint.sh:

#!/bin/bash
set -e
service postgresql start
exec "$@"

我的Jenkinsfile是

pipeline {
  agent {
    docker { image 'myimage' }
  }
  stages {
    stage('run unit tests') {
      steps {
        dir('tests') {
          sh 'php composer.phar install --prefer-dist --no-progress'
          sh 'php codecept run unit'
        }
      }
    }
  }
}

当我在交互模式下从命令行启动docker时它工作正常。 sudo docker run -it myimage bash导致容器运行,postgresql启动,等待bash的输入。

但是当Jenkins启动docker时,我收到以下错误

docker run -t -d -u 997:995 -w /path/to/workspace -v /path/to/workspace:rw,z -v /path/to/workspace@tmp:/path/to/workspace@tmp:rw,z myimage cat
docker top containerid -eo pid,comm


Failed to run top 'containerid '. Error: Error response from daemon: Container containerid is not running

我尝试从dockerfile中删除入口点,并将服务启动调用放在jenkins文件中,但是当Jenkins使用jenkins用户运行docker时,它在docker容器中不存在,它无法启动服务(权限被拒绝)。即使使用sudo,它也会返回错误sudo: unknown uid 997: who are you?

如何在触发作业时让jenkins运行docker容器,以某种方式启动postgresql,然后继续执行其余任务。

感谢任何帮助,谢谢。

罗布

1 个答案:

答案 0 :(得分:1)

我放弃了尝试让postgresql在同一容器中运行,并且有一个独立的容器,它自己运行postgresql,然后将它链接到php容器的新容器。这种方法工作正常。很遗憾,因为我现在无法同时运行多个php容器,因为它们会在数据库上发生冲突,而不是让自己的专用数据库在内部运行,但至少它可以工作。 / p>