当前位置: 首页 > 面试题库 >

如何使用jenkins pipline步骤在Docker映像中进行pip安装?

鲜于光辉
2023-03-14
问题内容

我有这个 Dockerfile

FROM python:3.7

CMD ["/bin/bash"]

和这个 Jenkinsfile

pipeline {
agent {
    dockerfile {
        filename 'Dockerfile'
    }
}
stages {
    stage('Install') {
        steps {
            sh 'pip install --upgrade pip'
        }
    }
}

这将导致以下错误:

The directory '/.cache/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
The directory '/.cache/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
Collecting pip
  Downloading https://files.pythonhosted.org/packages/d8/f3/413bab4ff08e1fc4828dfc59996d721917df8e8583ea85385d51125dceff/pip-19.0.3-py2.py3-none-any.whl (1.4MB)
Installing collected packages: pip
  Found existing installation: pip 19.0.2
Uninstalling pip-19.0.2:
Could not install packages due to an EnvironmentError: [Errno 13] 
Permission denied: '/usr/local/bin/pip'
Consider using the `--user` option or check the permissions.

我尝试使用--user,但没有成功。

我在--user 0:0docker jenkinsfile声明上使用args
时有些运气,但这会创建root拥有的目录和文件,这些文件和目录不能由用户Jenkins在下次运行时删除。

我不想pip install在Dockerfile上进行操作,因为实际上Install步骤正在运行一个make文件,而不是我想在其他上下文中使用的简化文件。

我还看到了更改的建议HOME environment var,这似乎可以解决有关前两级警告不属于当前用户但不Errno 13属于该部分的前2条警告。


问题答案:

正如我在此评论中提到的,解决方案应在容器内添加适当的用户。Jenkins984:984在我的机器上用于uid / gid(但可能与您的机器不同-登录到运行Jenkins的主机并html" target="_blank">执行sudo -u jenkins id-a以检测到它们),因此您需要将其复制到应由Jenkins运行的容器中:

FROM python:3.7

RUN mkdir /home/jenkins
RUN groupadd -g 984 jenkins
RUN useradd -r -u 984 -g jenkins -d /home/jenkins jenkins
RUN chown jenkins:jenkins /home/jenkins
USER jenkins
WORKDIR /home/jenkins

CMD ["/bin/bash"]

当然,由于您root不再是容器中的用户,因此请创建一个虚拟环境:

$ docker run --rm -it jenkins/python /bin/bash
jenkins@d0dc87c39810:~$ python -m venv myenv
jenkins@d0dc87c39810:~$ source myenv/bin/activate
jenkins@d0dc87c39810:~$ pip install numpy

或使用--user参数:

$ docker run --rm -it jenkins/python /bin/bash
jenkins@d0dc87c39810:~$ pip install --user --upgrade pip
jenkins@d0dc87c39810:~$ pip install --user numpy

等等

或者,您 可以 (但在大多数情况下不应该)以方式输入容器root,但使用jenkins组:

$ docker run --user 0:984 ...

这样,尽管修改后的文件仍将更改所有者,但它们的组所有权仍将保持不变,因此Jenkins将能够清理文件(或者您可以自己通过

sh 'rm -f modified_file'

Jenkinsfile



 类似资料:
  • 我正试图使用(根据亚马逊的建议)在一个自定义Docker映像中安装,该映像来自库/节点:6.11。2。这是一份报告: 然而,在上述情况下,我遇到了: 大概是因为我有不正确的Python和/或Pip版本? 我正在以与maven:3.5中的在那里,它工作正常。我不确定这两张图片之间的相关区别是什么。 从我的Dockerfile中删除上述选项对我也没有多大好处,因为这样我就会遇到一大堆不同的错误,摘录如

  • 问题内容: 我想创建一个docker镜像并正确安装,因此我选择具有这些属性的基础镜像。因此,的第一行如下: 然后下一个命令是 在创建docker映像时创建了以下错误: 如何能够在此docker映像中安装? 问题答案: 如提示: 获取(13:权限被拒绝) 我相信这是由于您的基本形象: https://github.com/SeleniumHQ/docker- selenium/blob/master

  • 问题内容: 我有下面的Dockerfile。 构建图像时,它在步骤23中失败,即 现在,当我重建时,由于docker使用缓存,它从步骤23开始构建。 但是,如果我想从步骤21重建图像,即 我怎样才能做到这一点?删除缓存的图像是唯一的选择吗?是否有其他参数可以做到这一点? 问题答案: 您可以通过执行以下操作来重建整个内容,而无需使用缓存 要强制从特定行开始重新运行,可以传递一个未使用的arg。Doc

  • 这是我第一次尝试创建Docker形象,我希望有人能帮助我。我的Dockerfile大致如下所示: 基本上,我只是为了扩展jar文件而安装Java。运行makefile时,出现以下错误: /bin/sh:1:/usr/lib/jvm/java-7-openjdk-amd64:权限被拒绝 我一直试图效仿这个例子:https://registry.hub.docker.com/u/barnybug/op

  • 问题内容: 我无法在Docker中安装pip。 这是我的Dockerfile: 建造时,我得到: 阅读此答案后,我尝试添加该行-这次的错误是: 我究竟做错了什么?我已经看到一些主张我应该尝试不同版本的Ubuntu的说法,但是切换到13.1并没有任何改变。 问题答案: 虽然T. Arboreus的答案可能会解决'archive.ubuntu.com‘来解决问题,但我认为您遇到的最后一个错误是它不知道

  • 问题内容: 我正在尝试在Ubuntu容器中下载Debian软件包,如下所示: 我懂了 我已经安装了docker,如下所示: 如何下载文件? 问题答案: 您需要先安装它。创建一个新的,并在其中安装wget: 然后,构建该图像: 最后,运行它: