gpt4 book ai didi

docker - 如何使用 jenkins 管道步骤在 docker 镜像中安装 pip ?

转载 作者:行者123 更新时间:2023-12-02 11:18:53 24 4
gpt4 key购买 nike

我有这个 Dockerfile :

FROM python:3.7

CMD ["/bin/bash"]

和这个 Jenkins 文件 :
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 ,没有成功。

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

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

我还看到了更改 HOME environment var 的建议。 ,这似乎修复了关于父目录不为当前用户所有的前 2 个警告,但不是 Errno 13部分。

最佳答案

正如我提到的 in this comment ,解决方案应该是在容器内添加适当的用户。 Jenkins 使用 984:984对于我机器上的 uid/gid(但在你的机器上可能不同 - 登录到 Jenkins 正在运行的主机并执行 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 - 如何使用 jenkins 管道步骤在 docker 镜像中安装 pip ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54812697/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com