没有项目描述
zenv-cli的Python项目详细描述
zenv:zen env
zenv是专门为开发人员创建的备用docker cli。 zenv的主要目标是简化在容器中运行控制台应用程序的过程,就像在本机(主机)应用程序中一样
Nativ command | Command executed inside container | |
---|---|---|
^{ | -> | ^{ |
用法
> zenv init
Zenv created!
> # run `ls` command inside contaner
> ze ls
动机
作为开发人员,在本地设置项目时,我通常需要在系统上安装其他应用程序。当然,像poetry、pipenv、npm、cargo、ext这样的现代包管理器可以完美地解决大多数依赖于单个技术堆栈的问题。但它们不允许解决系统库的安装问题。如果有许多项目需要不同版本的系统库,则会出现问题
在生产中,这个问题长期以来都是通过容器保温来解决的,通常是Docker
。因此,我的许多同事使用docker images和docker compose,不仅可以在生产环境中运行服务,还可以在本地计算机上开发和调试程序
不幸的是,这一过程中有几个问题:
- 您熟悉的一些实用程序可能未预先安装在容器中
- 如果在安装过程中尝试安装软件包,则会遇到缺少必要权限的情况
- 忘记用
print
调试
- 最主要的是失去了平常的体验,您无法使用自己喜爱的定制外壳
当然,上面描述的问题是通过创建一个docker映像来解决的,这个映像专门用于开发一个特定的项目,zenv
只是帮助创建这样的容器非常简单
功能
简化:与容器的所有交互都只需一个简短的命令:
ze
zenv自动将当前目录转发到具有相同pwd的容器
zenv自动将当前用户id、组id转发到容器
因此,在容器中创建的文件与在本机控制台中创建的文件具有相同的权限,您还可以使用
sudo
获取权限> sudo ze <command>
或
> sudo !!
zenv可以按本机方式转发环境变量
> MYVAR=LIVE!!!! ze env
当然,您可以在unix管道中组合本机命令和容器化命令
> ze ls | head -7 | ze tail -5
性能影响最小
自定义:您还可以使用zenvfile控制容器参数
安装
- 确保安装了最新版本的
Docker
- 对于Linux,确保您有用户的rights are allowed与Doker进行交互
- 确保您的python版本为3.6或更高版本
- 执行:
> sudo pip install zenv-cli # or > sudo pip3 install zenv-cli
工作原理
本质上,zenv是官方docker cli上的一个小型自动化层
初始值
命令zenv init
在当前目录中创建Zenvfile
。此文件描述与Docker映像和容器的关系,这些映像和容器将被创建以执行独立的命令。
默认情况下,使用的图像是ubuntu: latest
。
但是您可以通过设置-i
标志来更改它。例如:
> zenv init -i python:latest
或手动编辑Zenvfile
执行
命令zenv exec <COMMAND>
或它在容器环境中拍摄别名ze <COMMAND>
运行<COMMAND>
。运行命令时:
- zenv检查当前容器状态(运行、停止、删除),如果需要,则向上检查容器。
- 容器使用命令
sleep infinity
运行。因此它将很容易接近 - 运行命令的uid和gid被推入容器中。因此您可以使用
sudo ze <COMMAND>
- 执行该命令时,zenvfile所在路径中的目录将作为当前pwd转发到容器。因此,您可以运行
ze
从相对于zenvfile的深层目录 - 环境变量也被抛出到conta中。作为一个本地人。
> MYVAR=SUPER ze env
为了避免主机变量和容器变量之间的冲突,在创建zenvfile时,所有已安装的系统变量都会被置于黑名单中,从黑名单中可以删除编辑操作
其他命令
> zenv --help Usage: zenv [OPTIONS] COMMAND [ARGS]... ZENV(Zen-env): Containers manager for developer environment Usage: > zenv init -i centos:latest & ze cat /etc/redhat-release Options: --help Show this message and exit. Commands: exec Call some command inside the container info Show current container info init Initialize Environment: create Zenvfile rm Remove container (will stop the container, if need) stop Stop container stop-all Stop all zenv containers
示例安装jupyter笔记本
> mkgir norebooks
> cd notebooks
> zenv init -i python:3.7.3
编辑ZenVFile以分解笔记本端口后。更新ports = []
至ports = ["8888:8888"]
> sudo ze pip install jupyter numpy scipy matplotlib
运行笔记本
> sudo ze jupyter notebook --ip 0.0.0.0
使用url启动浏览器:http://localhost:8888
zenvfile
[docker]image="docker:dind"container_name="zenv-zenv-cli"[run]volumes=[ "`pwd`:`pwd`:rw",]ports=[]blacklist_environment=[ "TMPDIR", "__CF_USER_TEXT_ENCODING", "SHELL", "HOME"]autoremove=falsenetwork="bridge"command="sleep infinity"init_commands=["useradd -m -r -u `id -u` -g `id -gnr` `id -unr`",]init_user_commands=[][environment]