【问题标题】:Use docker image in jenkins build and start background service在 jenkins 构建中使用 docker 镜像并启动后台服务
【发布时间】:2018-05-24 03:52:31
【问题描述】:

我正在 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 中删除入口点,并将服务启动调用放在 jenkinsfile 中,但是由于 Jenkins 使用 jenkins 用户运行 docker,该用户在 docker 容器中不存在,因此无法启动服务(权限被拒绝)。即使使用 sudo 它也会返回错误sudo: unknown uid 997: who are you?

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

任何帮助表示赞赏,谢谢。

罗伯

【问题讨论】:

  • 你能不能在你的docker-entrypoint.sh 文件中尝试一件事,比如而不是exec "$@"tail -f /dev/nulltail -f /var/log/postgres.log 它会让你的容器保持在运行的后台,让你运行你的工作。作业完成后,您可以使用容器名称停止/删除它。我建议在运行命令中使用--name 而不是container-id,因为您可以修复它。
  • @chintanthakar 我刚刚尝试过,它对 Jenkins 没有任何影响,但在尝试执行 docker top 命令时,仍然会出现关于容器未运行的相同错误。是 Jenkins 形成和调用 docker 命令,所以我不知道我是否可以控制使用容器名称而不是 id,这正是 jenkins 所做的。
  • 你可以在Jenkinsfile 中输入相同的 docker 命令吗?可能是在制造问题。
  • @chintanthakar 不确定你的意思。
  • 我刚刚尝试使用 phusion.github.io/baseimage-docker 启动 postgresql,但我也无法正常工作

标签: docker jenkins dockerfile jenkins-pipeline


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 2022-08-03
    • 2017-07-16
    • 2021-09-04
    • 1970-01-01
    相关资源
    最近更新 更多