python项目的docker实用程序/模式

dockerutils的Python项目详细描述


特拉维西coveragepypipypipython 3.7python 3.6python 3.5python 3.4python 2.7

Docker实用程序/模式

DockerUtils是一组围绕其使用的实用程序和约定。这些实用程序的目的是提供 非常轻量级的抽象层:简化与Docker的交互;支持在本地或上无缝运行Docker aws中的ec2实例;允许每个项目有多个图像;等等。

也许考虑dockerutils的最好方法是它包含两个实体,通常在工作时使用 使用Docker和一组用于处理这些实体的补充命令。这两个实体是:

  • "dock"-托管docker的服务器(默认情况下,本地主机)
  • 图像-标准Docker图像

用于对这些实体进行操作的命令是:

<表><广告>命令集/实体 创建 执行 笔记本实用程序< /广告><正文>停靠注册驳接
注销驳接开始停靠
停止停靠nb停靠源Dock
ls Dock
ssh Dock图像构建图像 运行图像 运行笔记本发布图像
传输图像

可能的用例包括:

  • 将开发/测试依赖项从生产容器中分离出来,例如生产容器与开发/测试容器
  • 将数据科学笔记本容器与执行容器分离
  • 环境实验
  • 希望"冻结"一个容器中的任何外部依赖项并将其用作基础的情况 对于仅依赖于项目的容器

约定

  1. 在项目根目录下创建docker目录树

    在这个目录树中,对于所需的每个唯一的Docker容器类型,应该有一个子目录。 每个子目录都将包含用于创建映像的dockerfile 以及特定于该图像的任何源。

  2. 使用versioneer进行项目版本控制(可选)。

    作为映像构建的一部分,将生成一个文件\u version.py.bld,并将其放置在项目中 根。dockerfile可以在创建时将该文件添加到图像中,以防止需要包含 容器上下文中的.git目录树(通常非常昂贵)。

  3. 创建docker/base目录以使用内置的外部依赖关系隔离(可选)

    此功能支持Docker构建无法访问外部依赖项(Docker Hub, 例如,"锁定"环境中的服务器。可以定义一个基础图像来隔离任何 所需的依赖项。然后可以构建该图像,并使用传输图像来传输基本图像 到目标环境。

    后续图像可以基于"自包含"的图像构建(仅依赖于源 从项目中)。远程DockerAPI可以用来快速迭代,只需要 当外部依赖关系改变时,要使用繁琐的传输图像。

  4. 通过配置控制生成和运行图像(<;project\u dir>;/docker/dockerutils.cfg)

    包括设置大多数Docker参数,即卷装载、端口、网络、命令等 对用户、项目根目录等的可替换的支持。

命令行界面

映像cli

生成图像获取docker目录中某个子目录的名称,并生成 其中定义的图像。图像名为<;project>;-<;subdir>;:<;user>;

run image取其中一个子目录的名称(或dockerutils.cfg中定义的合成映像之一)。 与dockerutils.cfg中定义的该图像的任何配置一起启动docker容器

传输图像获取Docker图像名称,并使用Docker保存加载将图像传输到远程主机

发布图像获取docker目录中某个子目录的名称,并按 docker文件到定义的存储库(aws或docker)

笔记本电脑cli

运行记事本将使用记事本/记事本目录中的记事本容器启动记事本容器 如果存在,或者resero labs/docker ds否则。将装入当前目录 放入容器中,以便在juypter笔记本环境中使用。有几个环境变量需要注意 使用此命令:

  • Docker_ds_don_pull-如果设置,将使用当前可用的Resero Labs/Docker DS版本,而不是pull Docker Hub的最新版本。
  • resero_jupyter_diffs-如果已设置,则在保存时,.py文件和.html笔记本的文件将在.diffs子目录中创建。

dock cli

"dock"是一个远程系统,您可以通过ssh连接到它。您可以将终端"停靠"到远程实例,然后 任何docker命令,包括上面的image和notebook cli,都将在远程docker服务器上运行。曾经的"码头" 创建后,您可以通过发出命令来停靠终端source dock<;server ip or moniker>;

register dock用于将远程系统及其所有配置(用户名、IP和名字对象)添加到dock列表中

unregister dock用于删除对远程系统的引用

停止停靠会将远程停靠的实例状态更改为已停止

开始停靠会将远程停靠的实例状态更改为正在运行

ssh dock使用ssh在远程dock上打开一个终端

ls dock列出(包括状态)任何已创建的dock

nb dock在dock的裸ami上运行jupyter并打开笔记本服务器的浏览器窗口

dockerutils.cfg格式

docker/dockerutils.cfg中的配置用于配置dockerutils脚本的行为。

图像部分

cfg文件格式允许与 Docker目录树。每个部分都可以包含以下内容之一:

  • 环境-以(-e var=value)+的形式将环境传递到容器中
  • 交互式-e或-it
  • gpu-符合nvidia docker 2.0规范,例如--runtime=nvidia-e nvidia\u visible\u devices=all, 运行image-g将自动添加此项
  • 网络-容器的网络名称
  • -格式为(-v<;host dir>;:<;container dir>;)+或(--mount…)+或两者都是
  • 端口-格式为(-p<;host port>;:<;container port>;)+
  • cmd-任何有效的dockercmd规范
  • pull_from_on_force-默认为false,如果为true,则添加--强制生成图像(或基本图像)时的pull to build命令
  • 图像回购-要将图像发布到的存储库
  • 出版物标签-出版物标签(完整图像名称+标签)
  • 预构建脚本-在发出Docker构建之前要运行的shell命令或脚本
  • 后生成脚本-在Docker生成完成(成功)后运行的shell命令或脚本

合成图像

此外,可以通过添加一个run image节和一个synthetic_images定义来指定"合成"图像 包含"合成"图像列表的。其中每一个也可能有一个为docker定义的命名部分 子目录,但也必须包含解析为Docker子目录之一的名称值。例如:

[run_image]
synthetic_images=shell

[shell]
name=dev
...

仅配置图像

如果有一个Docker容器已经满足了您的要求,您可以通过 在图像的配置部分中指定名称标记前缀=false。例如基本笔记本 imageresero labs/docker ds通常足以针对您的代码运行jupyter笔记本,因为它会自动检测到 setup.py在容器启动并将模块安装到笔记本电脑环境中时。

图像标记

运行 美国犹他州柔软性。这可以通过将标记值添加到所需节来覆盖。例如:

[dev]
tag=experiment.2017.12.16
...

体积替换变量

卷规范可以包含环境变量($name${name}格式)以及特定的 形式为{var}的变量替换名称。支持的变量包括:

  • 项目根目录-将替换为项目的根目录名
  • 用户-将替换为运行命令的用户的用户名
  • 项目-将替换为项目名称
  • 主页-将替换为用户的主目录

图像推送替换变量

publication标签可以包含环境变量($name${name}格式)以及特定的 形式为{var}的变量替换名称。支持的变量包括:

  • 账户-aws账户名称
  • 区域-aws区域
  • 图像-图像名称
  • 标记-图像标记
  • 用户-将替换为运行命令的用户的用户名

发布到AWS

为了发布到aws,存储库将是映像名,下面应该 为发布到AWS的图像配置

image_repo=aws
publication_tag={account}.dkr.ecr.{region}.amazonaws.com/{image}:{tag}"

模式

在容器中运行代码,在您选择的编辑器中在容器外部进行实时修改

如果你像我一样,在你的宿主环境中,你有一整套工具用来处理你的项目。 使用Docker的缺点之一是很难将这些工具移植到容器中 环境。也许有一种方法可以让你的蛋糕和吃它! dev示例可以很好地做到这一点。

使用此模式,可以创建一个dockerfile文件,该文件包含图像中除项目源代码之外的所有内容。安 创建空的workdir,然后entrypoint甚至对空的workdir的内容执行pip install-e操作。 通过将源项目目录装入容器的workdir(请参见dev部分)中,我们可以获得所需的结果 (位于docker/dockertuils.cfg)。

使用此模式,您可以在容器中运行测试、实验等,对主机中的项目进行更改 环境工具集,并立即观察所做的更改。

在锁定环境中使用服务器

您可能会发现您需要在一个环境中与托管Docker的服务器一起工作 进入"外部世界"的机会有限。此模式可用于捕获基中的所有外部依赖项 在打开的环境中生成的映像,使用传输映像将此基本映像发送到服务器,然后 然后利用仅依赖于项目源和基础图像的派生图像进行迭代,而不需要打开 访问服务器。

将测试框架、代码分析工具等添加到容器中以进行测试/验证

同一容器中CPU和GPU的TensorFlow

有时尝试使用tensorflow的cpu和gpu版本是很有用的。docker/tensorflow中的示例提供了 这样做的模式。所有tensorflow depdenicies都安装到全局python站点包中。然后虚拟 为CPU和GPU版本创建环境,并将TensorFlow的适当版本安装到 各自的虚拟环境。

run image脚本使用主机操作系统上正在安装的nvidia docker 2.0。当使用-g选项运行时, nvidia运行时将用于使gpu可用可装在容器中。

容器启动后,将根据 -g选项。

要在使用符号链接的虚拟环境之间切换,请使用/cpu env/gpu env,例如。 源/cpu环境

版本管理器支持

如果您不使用versioner来版本您的python项目,则 应该是。versioner使用.git来确定项目版本。容器中有正确的版本信息 在许多情况下是可取的,但是将.git推入容器通常是不可取的。捕获版本信息 对于容器,genversion实用程序可用,并使用versioner的功能生成一个 项目根目录中的文件。此文件可用于dockerfile在 Docker图像。这方面的一个例子可以在cicd子目录中找到。

.dockerignore

为了最小化发送给Docker以生成图像的上下文,请参见本节.dockerignore中的示例 存储库。

关于实施的说明

我们选择使用python脚本中的docker命令行,而不是docker 可用于python的api因为它更好地集成到我的开发循环中。在每个cli打印时 它使用的docker命令,如果它做了一些意想不到的事情,则每个命令都要复制和粘贴 使用的命令,修改它,然后就可以使用,而无需通过cli实用程序代码进行调试, 允许以后在 项目开发循环。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java JPA,playframework,在分组之前选择order by   java如何让安卓app在一天中的特定时间做某事   web服务Java restlet文件上传使用符合RFC 5987的apache commons文件上传   如何使用java在一个用C++和Direct9编码的网页中运行应用程序?   允许生成ddl的java Postgres数据库设置   垃圾收集有哪些好的Java编码实践可以帮助Java GC?   java@RestController将表单返回到同一页面但URL不同   java Eclipse:无法将project facet动态Web模块的版本更改为2.3   无迭代器分配的内存管理Java NodeUpplicate集合   java Jackson:使用默认(反)序列化程序   Java:如何将保存在同一路径上的多个文件夹中的最大名称提取到一个文件夹名称都是数字的变量中?   java将二维字符串数组转换为二维整数数组