GVKun编程网logo

Docker - Python:使用本地安装的 pip 包的可能性(pip install docker)

3

如果您对Docker-Python:使用本地安装的pip包的可能性和pipinstalldocker感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解Docker-Python:使用本地安装的pi

如果您对Docker - Python:使用本地安装的 pip 包的可能性pip install docker感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解Docker - Python:使用本地安装的 pip 包的可能性的各种细节,并对pip install docker进行深入的分析,此外还有关于'pip install ' 和 'python -m pip install ' 有什么区别?、4 行指令解决 pip 下载 Python 第三方库太慢问题(pip 更换国内下载源)、CENTOS7 Python3.7 安装 pip 模块以及 pip 使用、Docker in Docker(实际上是 Docker outside Docker): /var/run/docker.sock的实用技巧。

本文目录一览:

Docker - Python:使用本地安装的 pip 包的可能性(pip install docker)

Docker - Python:使用本地安装的 pip 包的可能性(pip install docker)

如何解决Docker - Python:使用本地安装的 pip 包的可能性

大家好,我目前正在构建基于 Flask/mariadb/Nginx 等的 Web 应用程序。 我目前想知道你们是否知道使用我在本地开发机器上安装的 python 包的方法。

目前一切都是通过我的 Dockerfile 中的常规 requirements.txt 完成的。

这是我的 Compose 文件:

  1. version: ''3''
  2. services:
  3. backendserver:
  4. build:
  5. context: ./backendServer
  6. #dockerfile: ./backendServer/Dockerfile
  7. ports:
  8. - "5000:5000"
  9. networks:
  10. - db_network
  11. db:
  12. image: mariadb
  13. restart: always
  14. environment:
  15. MysqL_ROOT_PASSWORD: DB_PW
  16. MysqL_USER: DB_USER
  17. MysqL_DATABASE: DB_NAME
  18. volumes:
  19. - ./shared-files:/var/lib/MysqL
  20. networks:
  21. - db_network
  22. ports:
  23. - "3306:3306"
  24. pabs_ss:
  25. restart: always
  26. env_file: .env
  27. build: .
  28. volumes:
  29. - ./shared-files:/shared-files
  30. ports:
  31. - "5005:5005"
  32. networks:
  33. - db_network
  34. - web_network
  35. Nginx:
  36. restart: always
  37. image: "Nginx:latest"
  38. ports:
  39. - "85:85"
  40. volumes:
  41. - ./Nginx:/etc/Nginx/conf.d
  42. networks:
  43. - web_network
  44. depends_on:
  45. - pabs_ss
  46. networks:
  47. db_network:
  48. driver: bridge
  49. web_network:
  50. driver: bridge

这是我的 Dockerfile:

  1. FROM python:3.6
  2. ENV FLASK_APP run.py
  3. copY run.py gunicorn-cfg.py requirements.txt config.py .env ./
  4. copY app app
  5. #copY shared-files/db.sqlite3 /
  6. RUN pip install -r requirements.txt
  7. EXPOSE 5005 8080
  8. CMD ["gunicorn","--config","gunicorn-cfg.py","run:app"]

正如你所看到的,我目前使用的是“正常”的方式,尽管我越来越厌倦基本上每次都下载所有内容。

那么我知道如何在容器中使用本地机器上的 python 包吗?

谢谢和提前和这么久:)

'pip install <package>' 和 'python -m pip install <package>' 有什么区别?

'pip install ' 和 'python -m pip install ' 有什么区别?

如何解决''pip install <package>'' 和 ''python -m pip install <package>'' 有什么区别?

在什么情况下会使用一种方法而不是另一种方法?这两种方法都有缺点吗?

我见过这两种方法,但我不知道两者之间的区别是什么,而且我似乎无法找到该问题的答案。行为上有差异吗?或者一个只是另一个的进化版本?

例如,here 在所有答案中都使用了这两种方法。

注意:似乎也有一个很相似的问题here,但是这个问题只涉及使用-m时提供python -m pip install <package>的必要性,但与上述两种方法之间的差异无关。

解决方法

pip install ... 调用必须在您的路径上的 pip 可执行文件。 python -m pip ... invokes 对应于此 python 安装的 pip application(即 Python 将使用其正常的导入机制来解析 pip 包)。

通常这两种方法是一样的,但是想想alias pip=echo之后会发生什么; python -m pip ... 方法仍然有效。

例如,如果您在虚拟环境中,但您想将包安装到另一个 Python 安装中,则可以使用 python -m pip ... 方法:

(somevenv) $ pip install ...   # installs into ''somevenv''
(somevenv) $ /path/to/othervenv/bin/python -m pip install ...  # installs into ''othervenv''

最后,python -m pip ... 将始终使用“正确”的 Python 安装,假设您打算使用 python 指向的任何内容。

如果您想 install a distribution from within a running script,那么根据 pip docs 使用 python -m pip 方法也是首选方法。

4 行指令解决 pip 下载 Python 第三方库太慢问题(pip 更换国内下载源)

4 行指令解决 pip 下载 Python 第三方库太慢问题(pip 更换国内下载源)

 问题由来:

之前在写一篇项目博客时,pip 下载 Python 第三方库:graphic-verification-code实在太慢了,于是使用 Python 库官网下载,还是很慢,而且不断失败,下载慢且不断失败的根本原因是:该库文件是国外的下载源。

经过评论区的小伙伴们推荐,遂得一解决方法,分享给各位。


解决方法:

pip 下载更换国内源(Windows 系统),共 3 步,如下所示:

第 1 步:打开目录输入:% appdata%,打开 % appdata% 文件,如下图所示:

本文分享 CSDN - 不脱发的程序猿。
如有侵权,请联系 support@oschina.cn 删除。
本文参与 “OSC 源创计划”,欢迎正在阅读的你也加入,一起分享。

CENTOS7 Python3.7 安装 pip 模块以及 pip 使用

CENTOS7 Python3.7 安装 pip 模块以及 pip 使用

1、pip 升级

使用 sudo 安装完,python370 目录的权限为 root,需要修改,然后升级 pip

sudo chown -R pi:pi /usr/local/python370
ll /usr/local/python370
python370 -m pip install --upgrade pip

pip370 list
pip370 install --upgrade setuptools

2、编写脚本,指定 pip370 的国内镜像

vi /usr/local/python370/bin/mypip3.7

内容如下

cat /usr/local/python370/bin/mypip3.7
#!/usr/bin/bash

# 新版ubuntu要求使用https源,要注意。
# 清华:https://pypi.tuna.tsinghua.edu.cn/simple
# 阿里云:http://mirrors.aliyun.com/pypi/simple/
# 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
# 华中理工大学:http://pypi.hustunique.com/
# 山东理工大学:http://pypi.sdutlinux.org/ 
# 豆瓣:http://pypi.douban.com/simple/


if [ "$1" = "install" ] 
then
    echo "install begin"
    echo "exec cmd: /usr/local/python370/bin/pip3.7 $@ --index-url=https://pypi.tuna.tsinghua.edu.cn/simple  --trusted-host pypi.tuna.tsinghua.edu.cn"
    /usr/local/python370/bin/pip3.7 $@ --index-url=https://pypi.tuna.tsinghua.edu.cn/simple  --trusted-host pypi.tuna.tsinghua.edu.cn 
else
    echo "exec cmd: /usr/local/python370/bin/pip3.7 $@"
    /usr/local/python370/bin/pip3.7 $@
fi

添加权限和建立连接

chmod u+x /usr/local/python370/bin/mypip3.7
sudo ln -s /usr/local/python370/bin/mypip3.7 /usr/bin/mypip3.7.0
sudo ln -s /usr/local/python370/bin/mypip3.7 /usr/bin/mypip370

3、测试 

mypip370 install upgrade setuptools

 

Docker in Docker(实际上是 Docker outside Docker): /var/run/docker.sock

Docker in Docker(实际上是 Docker outside Docker): /var/run/docker.sock

在 Docker 容器里面使用 docker run/docker build

Docker 容器技术目前是微服务/持续集成/持续交付领域的第一选择。而在 DevOps 中,我们需要将各种后端/前端的测试/构建环境打包成 Docker 镜像,然后在需要的时候,Jenkins 会使用这些镜像启动容器以执行 Jenkins 任务。

为了方便维护,我们的 CI 系统如 Jenkins,也会使用 Docker 方式部署。 Jenkins 任务中有些任务需要将微服务构建成 Docker 镜像,然后推送到 Harbor 私有仓库中。 或者我们所有的 Jenkins Master 镜像和 Jenkins Slave 镜像本身都不包含任何额外的构建环境,执行任务时都需要启动包含对应环境的镜像来执行任务。

我们的 Jenkins Master、Jenkins Slaves 都是跑在容器里面的,该如何在这些容器里面调用 docker run 命令启动包含 CI 环境的镜像呢? 在这些 CI 镜像里面,我们从源码编译完成后,又如何通过 docker build 将编译结果打包成 Docker 镜像,然后推送到内网仓库呢?

答案下面揭晓。

一、原理说明:/var/run/docker.sock

Docker 采取的是 Client/Server 架构,我们常用的 docker xxx 命令工具,只是 docker 的 client,我们通过该命令行执行命令时,实际上是在通过 client 与 docker engine 通信。

我们通过 apt/yum 安装 docker-ce 时,会自动生成一个 systemd 的 service,所以安装完成后,需要通过 sudo systemctl enable docker.service 来启用该服务。 这个 Docker 服务启动的,就是 docker engine,查看 /usr/lib/systemd/system/docker.service,能看到有这样一条语句:

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

默认情况下,Docker守护进程会生成一个 socket(/var/run/docker.sock)文件来进行本地进程通信,因此只能在本地使用 docker 客户端或者使用 Docker API 进行操作。 sock 文件是 UNIX 域套接字,它可以通过文件系统(而非网络地址)进行寻址和访问。

因此只要以数据卷的形式将 docker 客户端和上述 socket 套接字挂载到容器内部,就能实现 "Docker in Docker",在容器内使用 docker 命令了。具体的命令见后面的「示例」部分。

要记住的是,真正执行我们的 docker 命令的是 docker engine,而这个 engine 跑在宿主机上。所以这并不是真正的 "Docker in Docker".

二、示例

在容器内部使用宿主机的 docker,方法有二:

  1. 命令行方式:将 /usr/bin/docker 映射进容器内部,然后直接在容器内部使用这个命令行工具 docker
    • 需要的时候,也可以将 /etc/docker 文件夹映射到容器内,这样容器内的 docker 命令行工具也会使用与宿主机同样的配置。
  2. 编程方式:在容器内部以编程的方式使用 docker
    • 通过 python 使用 docker: 在 Dockerfile 中通过 pip install docker 将 docker client 安装到镜像中来使用

容器的启动方式也有两种,如下:

1. 直接通过 docker 命令启动

示例命令如下:

docker run --name <name> \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v /usr/bin/docker:/usr/bin/docker \
    --user root \
    <image-name>:<tag>

**必须以 root 用户启动!(或者其他有权限读写 /var/run/docker.sock 的用户)**然后,在容器内就能正常使用 docker 命令,或者访问宿主机的 docker api 了。

2. 使用 docker-compose 启动

docker-compose.yml 文件内容如下:

version: ''3.3''
services:
  jenkins-master:
    image: jenkinsci/blueocean:latest
    container_name: jenkins-master
    environment:
      - TZ=Asia/Shanghai  # 时区
    ports:
      - "8080:8080"
      - "50000:50000"
    volumes:
      - ./jenkins_home:/var/jenkins_home  # 将容器中的数据映射到宿主机
      - /usr/bin/docker:/usr/bin/docker  # 为容器内部提供 docker 命令行工具(这个随意)
      - /var/run/docker.sock:/var/run/docker.sock  # 容器内部通过 unix socket 使用宿主机 docker engine
    user: root  # 必须确保容器以 root 用户启动!(这样它才有权限读写 docker.socket)
    restart: always

然后通过 docker-compose up -d 即可后台启动容器。

Docker 中的 uid 与 gid

通过上面的操作,我们在容器内执行 docker ps 时,还是很可能会遇到一个问题:权限问题

如果你容器的默认用户是 root,那么你不会遇到这个问题,因为 /var/run/docker.sock 的 onwer 就是 root.

但是一般来说,为了限制用户的权限,容器的默认用户一般都是 uid 和 gid 都是 1000 的普通用户。这样我们就没有权限访问 /var/run/docker.sock 了。

解决办法:

方法一(不一定有效):在构建镜像时,最后一层添加如下内容:

# docker 用户组的 id,通常都是 999
RUN groupadd -g 999 docker \
    && usermod -aG docker <your_user_name>

这样我们的默认用户,就能使用 docker 命令了。

P.S. 999 不一定是 docker 用户组,所以上述方法某些情况下可能失效。这时还是老老实实通过 docker run -u root 启动容器吧。(或者在 docker-compose.yml 中添加 user: root 属性)

参考

  • Docker in Docker - 王柏元

今天关于Docker - Python:使用本地安装的 pip 包的可能性pip install docker的分享就到这里,希望大家有所收获,若想了解更多关于'pip install ' 和 'python -m pip install ' 有什么区别?、4 行指令解决 pip 下载 Python 第三方库太慢问题(pip 更换国内下载源)、CENTOS7 Python3.7 安装 pip 模块以及 pip 使用、Docker in Docker(实际上是 Docker outside Docker): /var/run/docker.sock等相关知识,可以在本站进行查询。

本文标签:

上一篇Fedora 33 ROS Noetic 'Could not find Boost (missing:python) (found version "1.73.0")' 错误

下一篇使用 selenium python 更改标签的属性值(python selenium切换标签页)