【发布时间】: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/null或tail -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