python项目的docker实用程序/模式
dockerutils的Python项目详细描述
Docker实用程序/模式
DockerUtils是一组围绕其使用的实用程序和约定。这些实用程序的目的是提供 非常轻量级的抽象层:简化与Docker的交互;支持在本地或上无缝运行Docker aws中的ec2实例;允许每个项目有多个图像;等等。
也许考虑dockerutils的最好方法是它包含两个实体,通常在工作时使用 使用Docker和一组用于处理这些实体的补充命令。这两个实体是:
- "dock"-托管docker的服务器(默认情况下,本地主机)
- 图像-标准Docker图像
用于对这些实体进行操作的命令是:
<表><广告>注销驳接
停止停靠
ls Dock
ssh Dock
传输图像
可能的用例包括:
- 将开发/测试依赖项从生产容器中分离出来,例如生产容器与开发/测试容器
- 将数据科学笔记本容器与执行容器分离
- 环境实验
- 希望"冻结"一个容器中的任何外部依赖项并将其用作基础的情况 对于仅依赖于项目的容器
约定
在项目根目录下创建docker目录树
在这个目录树中,对于所需的每个唯一的Docker容器类型,应该有一个子目录。 每个子目录都将包含用于创建映像的
dockerfile
以及特定于该图像的任何源。使用versioneer进行项目版本控制(可选)。
作为映像构建的一部分,将生成一个文件
\u version.py.bld
,并将其放置在项目中 根。dockerfile可以在创建时将该文件添加到图像中,以防止需要包含 容器上下文中的.git目录树(通常非常昂贵)。创建docker/base目录以使用内置的外部依赖关系隔离(可选)
此功能支持Docker构建无法访问外部依赖项(Docker Hub, 例如,"锁定"环境中的服务器。可以定义一个基础图像来隔离任何 所需的依赖项。然后可以构建该图像,并使用
传输图像
来传输基本图像 到目标环境。
后续图像可以基于"自包含"的图像构建(仅依赖于源 从项目中)。远程DockerAPI可以用来快速迭代,只需要 当外部依赖关系改变时,要使用繁琐的传输图像。
通过配置控制生成和运行图像(<;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或-itgpu
-符合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实用程序代码进行调试, 允许以后在 项目开发循环。