首页 文章 精选 留言 我的

精选列表

搜索[教程],共9660篇文章
优秀的个人博客,低调大师

jianying-editor技能安装教程

我用AI自动剪了一条35秒短视频,全程没碰剪映时间线 在这里插入图片描述 前几天有个朋友跟我吐槽: "剪映是真好用,但每次导入素材、拖时间线、加字幕、配BGM,一套操作下来,比拍视频还累。" 我太懂这种感觉了。 直到我最近翻到一个开源小工具——jianying-editor,它能让你用Python脚本,一句话就把素材、字幕、配音、BGM全塞进剪映草稿里。 指令 1:豆包你好,帮我安装 Jianyi

优秀的个人博客,低调大师

DolphinDB Python API 离线安装教程

出于安全考虑,通常生产环境与互联网隔离,因此无法使用pip install在线安装 DolphinDB Python API(以下简称 Python API)。本文介绍如何离线安装 Python API 环境,包括 conda 环境和 wheel 安装两种方式。用户可根据生产环境的使用需求、应用场景自行选择。 1 环境准备 首先准备构建环境,包括在线环境与离线环境,其中在线环境用于在线收集和构建资源,离线环境用于离线安装与验证。 构建环境需要与目标环境尽可能的一致,包括操作系统版本、CPU 架构、Python 版本等。其中在线环境用于下载并构建各种资源,离线环境用于构建与测试 Python API 的安装包。 1.1 Linux 环境准备 推荐使用类似 virtual box 的虚拟化工具来制作环境。假设我们需要在 KyLin v10,x86-64, Python 3.8 的目标环境中安装 Python API,那么需要准备以下环境: 在线环境 操作系统:KyLin v10 CPU:Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz 主机平台:VirtualBox 6.1 网络:NetWork Bridge 离线环境 操作系统:KyLin v10 CPU:Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz 主机平台:VirtualBox 6.1 网络:HostOnly 其中HostOnly(仅主机模式)的网络模式可以保证该机器与互联网无法连接。 1.2 Windows 环境准备 Windows 环境可以准备两台机器(可以是 PC),一台用于在线获取资源,并禁用另一台机器的网络进行离线安装测试。有关 Windows 下安装和配置 Conda 环境,详见Windows 安装。 2 Linux conda 安装 2.1 安装 miniconda 推荐使用 miniconda,通常生产环境比较复杂,需要虚拟环境以保证隔离性。 Miniconda — conda documentation wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh sh Miniconda3-latest-Linux-x86_64.sh 安装并激活 base 虚拟环境。 source ~/.bashrc 使用conda env list验证安装已完成: 2.2 配置 miniconda 分别配置在线、离线环境的 conda: conda 环境配置 conda config // 在 ~/目录下会出现文件 .condarc 编辑~/.condarc文件 show_channel_urls: true envs_dirs: - ~/envs pkgs_dirs: - ~/pkgs 2.3 在线环境下载包 运行以下命令下载 package conda create -n test38 numpy=1.22.3 pandas python=3.8.13 --download-only 要求 numpy 为1.18到1.22.3之间的版本, 推荐使用1.22.3版本。 2. 压缩并上传 package 压缩.condarc pkgs_dirs路径下的依赖包,并上传至离线环境的 pkgs 目录。 tar -zcvf pkgs.tar.gz pkgs/ md5sum pkgs.tar.gz > pkgs.tar.gz.md5 2.4 离线安装 conda 环境 上传至离线环境后,需检查下完整性: (base) root@peter-VirtualBox:~# md5sum -c pkgs.tar.gz.md5 pkgs.tar.gz: 成功 2. 校验完整性通过后,再解压: tar -zxvf pkgs.tar.gz 3. 创建虚拟环境: conda create -n offline38 numpy pandas python=3.8.13 --offline conda activate offline38 2.5 安装 DolphinDB Python API 1. 下载 whl 包 根据 CPU 架构、操作系统,从官方网站pypi.org下载对应的 Python API 安装包。 对应 x86_64, Python3.8 的包: 下载链接 2. pip 离线安装 pip install dolphindb-1.30.19.2-cp38-cp38-manylinux2010_x86_64.whl 3. 验证安装是否成功 (offline38) root@peter-VirtualBox:~# python Python 3.8.13 (default, Mar 28 2022, 11:38:47) [GCC 7.5.0] :: Anaconda, Inc. on linux Type "help", "copyright", "credits" or "license" for more information. >>> import dolphindb as ddb >>> s = ddb.session() >>> s <dolphindb.session.session object at 0x7fa5d6534280> 能正常生成 session 就说明已安装成功安装 Python API。 3 Linux wheel 安装 3.1 在线环境收集 wheel 包 使用 pip wheel 命令收集相关 whl 包: pip install wheel && pip wheel dolphindb 执行完成后,默认会在当前目录保存相关 whl 包。 (py38) [root@node1 ~]# ls *.whl|sort dolphindb-1.30.19.2-cp38-cp38-manylinux2010_x86_64.whl future-0.18.2-py3-none-any.whl numpy-1.22.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl pandas-1.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl python_dateutil-2.8.2-py2.py3-none-any.whl pytz-2022.2.1-py2.py3-none-any.whl six-1.16.0-py2.py3-none-any.whl 3.2 离线环境安装 wheel 包 pip install *.whl (py38) root@peter-VirtualBox:~/wpkgs# pip install *.whl Processing ./dolphindb-1.30.19.2-cp38-cp38-manylinux2010_x86_64.whl Processing ./future-0.18.2-py3-none-any.whl Processing ./numpy-1.22.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl Processing ./pandas-1.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl Processing ./python_dateutil-2.8.2-py2.py3-none-any.whl Processing ./pytz-2022.2.1-py2.py3-none-any.whl Processing ./six-1.16.0-py2.py3-none-any.whl Installing collected packages: pytz, six, numpy, future, python-dateutil, pandas, dolphindb Successfully installed dolphindb-1.30.19.2 future-0.18.2 numpy-1.22.3 pandas-1.5.0 python-dateutil-2.8.2 pytz-2022.2.1 six-1.16.0 3.3 安装后验证 分别验证一下 whl 包和 Python API。 pip list (py38) root@peter-VirtualBox:~/wpkgs# pip list Package Version --------------- --------- certifi 2022.9.14 dolphindb 1.30.19.2 future 0.18.2 numpy 1.22.3 pandas 1.5.0 pip 22.1.2 python-dateutil 2.8.2 pytz 2022.2.1 setuptools 63.4.1 six 1.16.0 wheel 0.37.1 Python API (offline38) root@peter-VirtualBox:~# python Python 3.8.13 (default, Mar 28 2022, 11:38:47) [GCC 7.5.0] :: Anaconda, Inc. on linux Type "help", "copyright", "credits" or "license" for more information. >>> import dolphindb as ddb >>> s = ddb.session() >>> s <dolphindb.session.session object at 0x7fa5d6534280> 能正常生成 session 就说明安装成功。 4 Windows conda 安装 分别在离线环境、在线环境安装并配置好 miniconda 环境。并通过在线环境构建 dolphindb 依赖包 dolphindb wheel 包 并上传至离线环境,来完成安装。 注:miniconda 的安装和配置分别在在线环境和离线环境完成,且目录名称须一致。 4.1 安装 miniconda 选择对应 Python 版本的 minicoda,下载Miniconda3 Windows 64-bit并安装。安装完成后,将 conda 加入 Windows 命令搜索路径: ​此电脑 → 属性 → 查找设置 →输入:编辑系统环境变量 → 环境变量 → 系统环境变量 在新建中输入 condabin 目录的完整路径,如: D:\ProgramData\Miniconda3\condabin 点击确定,新开 cmd 窗口验证 C:\Users\wfhuang>conda -V conda 4.12.0 4.2 配置 miniconda 设置包路径,如D:\pkgs D:\pythonApi>conda config --add pkgs_dirs D:\pkgs 4.3 在线环境下载包 参考4.2,在在线环境中配置好包路径,并下载 DolphinDB 相关依赖包 conda create -n test38 numpy=1.22.3 future pandas python=3.8.13 --download-only 在设置的 pkgs_dirs 中,会有存放相关依赖包。压缩后,包大小约为450MB 4.4 离线安装 conda 环境 将pkgs压缩包上传至离线环境,比较包的所占字节数,验证包是否完整。 校验完整性通过后,再解压至 pkgs 目录、创建虚拟环境: conda create -n offline38 numpy pandas future python=3.8.13 --offline conda activate offline38 4.5 安装 Python API 下载 whl 包 根据 CPU 架构、操作系统,从官方网站DolphinDB下载对应的 Python API 安装包。 对应 Windows, x86_64, Python3.8 的包: https://files.pythonhosted.org/packages/62/ff/382aff0a2add9ce5c779c14d0d7fbfcec62ab0748b5778731a7fe524c2af/dolphindb-1.30.19.2-cp38-cp38-win_amd64.whl pip 离线安装 pip install dolphindb-1.30.19.2-cp38-cp38-win_amd64.whl 验证安装是否成功 import dolphindb as ddb s = ddb.session() s.connect("192.168.1.157", 8848, "admin", "123456") s.run("print(\"Welcome to DolphinDB!\")") s.close() D:\pythonApi>python hello_ddb.py Welcome to DolphinDB! 输出欢迎信息说明安装已经成功。 5 Windows wheel 安装 配置一个与目标环境相同的构建环境。例如目标环境是 x86-64, Windows server 2016, Python 3.8.10,那么可以准备一个 x86-64, Windows 10, Python 3.8.10 的 PC 环境。 5.1 在线环境收集 wheel 包 收集 Python API 的 wheel 包,并生成清单文件 requirements.txt。 1. pip wheel 使用 wheel 在当前环境构建相关 whl 包,并解决相关依赖。 pip wheel dolphindb -i https://pypi.tuna.tsinghua.edu.cn/simple 使用 -i 可以指定镜像源加速构建,例如中国地区可以选择清华源。执行完成后,默认会在当前目录保存相关 whl 包。 2. pip install 安装 Python API,用于生成依赖清单文件 requirements.txt。 pip install dolphindb -i https://pypi.tuna.tsinghua.edu.cn/simple 3. pip freeze 使用 freeze 解析 Python API 的依赖,并输出至文件 requirements.txt。 pip freeze dolphindb > requirements.txt 上述步骤完成后,目录类似如下(不同版本会有差异)。 5.2 离线环境安装 wheel 包 将相关 whl 包、requirements.txt 上传至 Python 离线环境,并通过 pip install 安装, 使用-r选项从指定的清单文件requirements.txt中批量安装 wheel 包。 pip install -r requirements.txt D:\pythonApi>pip install -r requirements.txt Processing d:\pythonapi\dolphindb-1.30.19.2-cp38-cp38-win_amd64.whl Processing d:\pythonapi\numpy-1.22.3-cp38-cp38-win_amd64.whl Processing d:\pythonapi\pandas-1.5.1-cp38-cp38-win_amd64.whl Processing d:\pythonapi\python_dateutil-2.8.2-py2.py3-none-any.whl Processing d:\pythonapi\pytz-2022.6-py2.py3-none-any.whl Processing d:\pythonapi\six-1.16.0-py2.py3-none-any.whl Collecting future==0.18.2 Using cached future-0.18.2-py3-none-any.whl Installing collected packages: six, pytz, python-dateutil, numpy, pandas, future, dolphindb Successfully installed dolphindb-1.30.19.2 future-0.18.2 numpy-1.22.3 pandas-1.5.1 python-dateutil-2.8.2 pytz-2022.6 six-1.16.0 5.3 安装后验证 分别验证下 whl 包和 Python API 。 pip list C:\pythonApi>pip list Package Version --------------- --------- dolphindb 1.30.19.2 future 0.18.2 numpy 1.22.3 pandas 1.5.1 pip 21.1.1 python-dateutil 2.8.2 pytz 2022.6 setuptools 56.0.0 six 1.16.0 验证安装是否成功 import dolphindb as ddb s = ddb.session() s.connect("192.168.1.157", 8848, "admin", "123456") s.run("print(\"Welcome to DolphinDB!\")") s.close() D:\pythonApi>python hello_ddb.py Welcome to DolphinDB! 输出欢迎信息说明安装已经成功。 6 总结 总体而言,wheel 包安装比较简单快捷,而 conda 安装相对复杂,但是可以构建一个隔离环境。 安装方式 优点 不足 conda 提供虚拟环境 整个安装包大概在500M左右,上传至生产环境比较耗时,且需要校验完整性 wheel 简单快捷,安装包小 无法提供虚拟环境,可能与现有的 Python 环境相冲突 7 附录 7.1 pip 常用命令 pip list // 列出当前安装的包 pip freeze packageA // 列出 packageA 的依赖信息 pip wheel packageA // 构建 packageA 的依赖 wheel 包 pip search packageA // 在官方仓库 PyPI 搜索 packageA 7.2 conda 常用命令 离线创建虚拟环境 conda create -n py38 python=3.8.13 --offline 激活/关闭虚拟环境 conda env list //查看所有虚拟环境 conda activate py38 //激活 py38 conda deactivate //退出当前虚拟环境 清理并删除 conda 环境: conda deactivate conda remove -n offline38 --all 7.3 常见问题处理 Q:conda 离线安装缺失包 PackagesNotFoundError: The following packages are not available from current channels: - pandas - python=3.8.13 - numpy A:检查下pkgs_dirs是否设置正确,以及在该目录下是否有提示信息中的包。不能有任何中间目录,例如设置 conda 的包目录为 pkgs,那么 pkgs/pkgs/numpy 是无法被 conda 找到的。 Q:wheel 包未安装 error: invalid command 'bdist_wheel' A:使用 pip 安装 wheel pip install wheel Q:future 包缺失 Failed to build future ERROR: Failed to build one or more wheels WARNING: Ignoring invalid distribution -ip (d:\program files\python3.7\lib\site-packages) A:可以手动收集下 future 包,并上传至离线环境。 pip wheel future Q:构建 future whl 包失败 Failed to build future ERROR: Failed to build one or more wheels WARNING: Ignoring invalid distribution -ip (d:\program files\python3.7\lib\site-packages) A:因 pip 下载、安装未成功而导致的环境异常,进入pip --version输出信息中的 site-packages/pip 目录,删除~开头的一些临时文件。 (base) [root@node1 ~]# pip --version pip 21.2.4 from /root/miniconda3/lib/python3.9/site-packages/pip (python 3.9) Q:Python API 安装失败 ERROR: Could not find a version that satisfies the requirement dolphindb (from versions: none) A:安装环境与 whl 包不匹配导致。可以按如下步骤处理: 通过PyPI确认是否存在支持当前操作系统(例如 Linux ARM 架构、Mac M1等)的 DolphinDB API 安装包。若存在,则将该 whl 包下载至本地。 通过如下命令查看适合当前系统环境支持的 whl 包后缀。 pip debug --verbose 根据 Compatible tags 的显示信息,将 DolphinDB 的 whl 包名修改为适合系统架构的名称。以 Mac(x86_64) 系统为例:安装包名为“dolphindb-1.30.19.2-cp37-cp37m-macosx_10_16_x86_64.whl”。但查询到 pip 支持的当前系统版本为10.13,则使用“10_13”替换 whl 包名中的“10_16”。 尝试安装更名后的 whl 包。 若执行完上述操作后,仍无法安装或导入,可在DolphinDB 社区中进行反馈。

优秀的个人博客,低调大师

技能篇:docker的简易教程

虚拟机技术每家公司发展到一定规模都必须考虑的,更好的环境隔离,更好的事故排查,更好的服务部署 docker的原理 docker更换阿里源 docker容器的相关命令 Dockerfile文件编写 docker镜像的相关命令 1 docker的原理 Docker 利用Linux 中的核心分离机制,例如Cgroups,以及Linux的核心Namespace(名字空间)来创建独立的容器。一句话概括起来Docker就是利用Namespace做资源隔离,用Cgroup做资源限制,利用Union FS做容器文件系统的轻量级虚拟化技术。Docker容器的本质还是一个直接运行在宿主机上面的特殊进程,看到的文件系统是隔离后的,但是操作系统内核是共享宿主机OS,所以说Docker是轻量级的虚拟化技术 docker 镜像分层 docker 容器,理解为一个或多个运行进程,而这些运行进程将占有相应的内存,相应的CPU计算资源,相应的虚拟网络设备以及相应的文件系统资源。而 docker 镜像,则像一个未运行的软件包,为 docker 容器的运行提供文件资源。 docker 镜像是分层的。启动镜像时,一个新的可写层会加载到镜像的顶层。这一层通常称为"容器层",之下是"镜像层",可能存在多个层。容器层可以读写,容器所有发生文件变更写都发生在这一层。镜像层只允许读取,read-only 在容器层的文件增删操作,命令安装,都会被记录下来。我们可以通过 commit 命令来创建一个新的镜像 2 docker 更换阿里源 # vi /etc/apt/sources.list ~~更新源 # sudo apt-get clean # sudo apt-get update ~~ 安装vim # apt-get install vim 复制代码 ubuntu 18 的阿里镜像文件。使用下面的数据替换原 sources.list 里的数据 deb http://mirrors.aliyun.com/ubuntu/ trusty main multiverse restricted universe deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main multiverse restricted universe deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main multiverse restricted universe deb http://mirrors.aliyun.com/ubuntu/ trusty-security main multiverse restricted universe deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main multiverse restricted universe deb-src http://mirrors.aliyun.com/ubuntu/ trusty main multiverse restricted universe deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main multiverse restricted universe deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main multiverse restricted universe deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main multiverse restricted universe deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main multiverse restricted universe 复制代码 3 docker容器的相关命令 run 实例化容器 创建一个新的容器并运行:docker run [options] image [command]。image 可以是镜像ID 也可以是仓库名+Tag名:repository[:tag] options 常用参数 -i 以交互模式运行容器,通常与 -t 同时使用 -t 为容器重新分配一个伪输入终端,通常与 -i 同时使用 -d 后台运行容器,并返回容器ID --name=<name> 为容器指定一个名称 -p 指定端口映射,格式为:主机(宿主)端口:容器端口 --net="bridge" 指定容器的网络连接类型,支持bridge/host/none/container: 四种类型 -e ="v" 设置环境变量 复制代码 示例 [root@lwl]# docker run -it -p 80:80 --name mynginx nginx:latest /bin/bash root@b8573233d675:/# ~~ 如果容器的启动命令是依赖伪终端执行,则需要 -it,如 ubuntu:14.04 镜像 ~~ 没有依赖伪终端执行的启动命令,可去掉-it,因为-d 参数会直接返回容器ID [root@lwl]# docker run -it -d -p 80:80 --name mynginx nginx:latest 315cc38afc2f06abb5a2fbb075ebca16455367b2de685cf0c5ba828ab62dd5a1 [root@lwl]# 复制代码 start、stop、restart 启动与停止 ~~ 启动已被停止的容器 。 container 可以是容器名 也可以是容器ID # docker start container ~~ 停止运行中的容器 # docker stop container ~~ 重启容器 # docker restart container 复制代码 ps 容器查询 // 列出容器 # docker ps [-options] -a :显示所有的容器,包括未运行的。 -f :根据条件过滤显示的内容。 --format :指定返回值的模板文件。 -l :显示最近创建的容器。 -n :列出最近创建的n个容器。 --no-trunc :不截断输出。 -q :静默模式,只显示容器编号。 -s :显示总的文件大小 // 相当于在 container 容器里使用 top命令 # docker top container 复制代码 rm 删除容器 # docker rm container 复制代码 cp 文件传输 本机和 docker 容器之前的文件传输 ~~ 复制本地目录 srcPath 到 容器 container 的目录 destPath # docker cp srcPath container:destPath ~~ 复制容器 container 的目录 srcPath 到本地目录 destPath # docker cp container:destPath srcPath 复制代码 exec 在运行的容器中执行命令 docker exec [options] container command -d :分离模式: 在后台运行 -i :即使没有附加也保持STDIN 打开 -t :分配一个伪终端 ~~ 在容器 mynginx 中以交互模式执行容器内 /root/run.sh 脚本 # docker exec -it mynginx /bin/sh /root/run.sh ~~ 在容器 mynginx 中开启一个交互模式的终端 # docker exec -it mynginx /bin/bash 复制代码 logs 获取容器的日志 docker logs [options] container -f 跟踪日志输出 --since 显示某个开始时间的所有日志 -t 显示时间戳 --tail 仅列出最新N条容器日志 [root@lwl]# docker logs -f mynginx 192.168.239.1 - - [10/Jul/2021:16:53:33 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36" "-" 2021/07/10 16:53:33 [error] 5#5: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.239.1, server: localhost, request: "GET /favicon.ico HTT .... 复制代码 4 Dockerfile文件编写 # docker build -f /path/to/a/Dockerfile 复制代码 // 1 FROM:指定基础镜像,必须为第一个命令,格式: FROM <image> FROM <image>:<tag> // 2 MAINTAINER: 维护者信息 格式: MAINTAINER <name> // 3 ENV:设置环境变量 格式 // 4 ARG:用于指定传递给构建运行时的变量 格式: ARG <name>[=<default value>] // 5 WORKDIR:工作目录,类似于cd命令 格式: WORKDIR /path/to/workdir ENV <key>=<value // 6 ADD:将本地文件添加到容器中,可以访问网络资源,类似wget ADD <src>... <dest> // 7 COPY:功能类似ADD,但是是不会自动解压文件 // 8 RUN:构建镜像时执行的命令 格式 RUN <command> // 9 CMD:构建容器后调用,也就是在容器启动时才进行调用 CMD command param1 param2 (执行shell内部命令) // 10 ENTRYPOINT:配置容器,使其可执行化 ENTRYPOINT command param1 param2 (shell内部命令) 复制代码 Dockerfile 示例 # 基础镜像 FROM centos # 维护者信息 MAINTAINER tianfeiyu #ENV 设置环境变量 ENV PATH /usr/local/nginx/sbin:$PATH #ADD 文件放在当前目录下,拷过去会自动解压 ADD nginx-1.8.0.tar.gz /usr/local/ ADD epel-release-latest-7.noarch.rpm /usr/local/ # RUN 执行以下命令 RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all RUN useradd -s /sbin/nologin -M www # WORKDIR 相当于cd WORKDIR /usr/local/nginx-1.8.0 RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install RUN echo "daemon off;" >> /etc/nginx.conf # CMD 运行以下命令 CMD ["nginx"] 复制代码 5 docker 镜像的相关命令 镜像查看列举:docker images 镜像搜索:docker search <imageName>;imageName 是 repository[:tag] 的模糊词 拉取:docker pull repository[:tag] 删除单个镜像:docker rmi 镜像ID 或者docker rmi repository[:tag] 给镜像打别名(标签):docker tag oldRepository[/:oleTag] newRepository][/:newTag] # docker tag ubuntu:15.10 lwl/ubuntu:v3 复制代码 构建镜像 ~~ 根据 Dockerfile 构建镜像 # docker build -t repository[:tag] dir # docker build -t lwl/ubuntu:v1 . options 参数 --build-arg=[] 设置镜像创建时的变量 -t 镜像的名字及标签,通常 name:tag 或者 name 格式 -f 指定要使用的Dockerfile路径 复制代码 ~~ 根据正在运行的 container 容器 构建镜像 # docker commit [options] container repository[:tag] options 参数 -a :提交的镜像作者; -c :使用Dockerfile指令来创建镜像; -m :提交时的说明文字; -p :在commit时,将容器暂停 复制代码 推送:docker push repository[:tag] 欢迎指正文中错误 创作不易,如果对大家有所帮助,希望大家点赞支持,有什么问题也可以在评论区里讨论😄~ 如果你觉得这篇文章对你有点用的话,麻烦请给我们的开源项目点点star: http://github.crmeb.net/u/defu 不胜感激 ! 来自 “开源独尊 ” ,链接: https://ym.baisou.ltd/post/798.html

优秀的个人博客,低调大师

Flink进阶教程之SideOutputSplit分流

版本说明: 环境: Windiws Scala: 2.11.8 Flink :1.10.1 大部分的DataStream API的算子的输出是单一输出,也就是某种数据类型的流。 除了split算子,可以将一条流分成多条流,这些流的数据类型也都相同。 process function的side outputs功能可以产生多条流(Flink 1.9版本之后推荐此种方案),并且这些流的数据类型可以不一样。一个side output可以定义为OutputTag[X]对象,X是输出流的数据类型。process function可以通过Context对象发射一个事件到一个或者多个side outputs。 import org.apache.flink.streaming.api.scala.{DataStream, OutputTag, StreamExecutionEnvironment} import org.apache.flink.api.scala._ import org.apache.flink.streaming.api.TimeCharacteristic import org.apache.flink.streaming.api.functions.ProcessFunction import org.apache.flink.util.Collector /** * * @param deviceNo 设备号 * @param timestamp 时间戳 * @param temperature 温度 */ case class SensorReading(deviceNo: String, timestamp: Long, temperature: Double) object SensorReadingSplitStreaming { def main(args: Array[String]): Unit = { val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment //设置时间语义 时间发生时间 env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime) env.setParallelism(1) val socketSource: DataStream[String] = env.readTextFile("D:\\tmp\\file1.txt") val mapStream: DataStream[SensorReading] = socketSource .map(data => { val split: Array[String] = data.split(",") SensorReading(split(0).trim, split(1).trim.toLong, split(2).trim.toDouble) }) //对数据流进行分流处理 val tmpStageStream: DataStream[SensorReading] = mapStream.process(new TempStageProcess()) tmpStageStream.print("main"); val lowStream: DataStream[(String, Double)] = tmpStageStream.getSideOutput(new OutputTag[(String, Double)]("low-tmp")) val highStream: DataStream[(String, Double)] = tmpStageStream.getSideOutput(new OutputTag[(String, Double)]("high-tmp")) lowStream.print("low") highStream.print("high") env.execute() } } class TempStageProcess() extends ProcessFunction[SensorReading, SensorReading] { // 定义侧输出流 lazy val lowTmp: OutputTag[(String, Double)] = new OutputTag[(String, Double)]("low-tmp"); lazy val HighTmp: OutputTag[(String, Double)] = new OutputTag[(String, Double)]("high-tmp"); //处理数据 override def processElement(value: SensorReading, context: ProcessFunction[SensorReading, SensorReading]#Context, collector: Collector[SensorReading]): Unit = { if (value.temperature < 10) { context.output(lowTmp, (value.deviceNo, value.temperature)) } else if (value.temperature > 70) { context.output(HighTmp, (value.deviceNo, value.temperature)) } else { collector.collect(value) } } } //测试文件内容如下↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ /* 设备8,1610035289736,84.3 设备5,1610035371758,38.8 设备5,1610035458637,60.2 设备1,1610035543127,10.2 设备7,1610035623427,51.6 设备5,1610035705302,20.1 设备5,1610035787387,12.9 设备7,1610035877019,88.2 设备6,1610035960537,33.5 设备7,1610036043040,63.0 设备5,1610036125179,64.5 设备6,1610036214972,30.2 设备5,1610036296542,56.5 设备7,1610036377999,29.7 设备6,1610036467523,59.4 设备4,1610036557446,71.1 设备5,1610036641100,28.2 设备2,1610036725803,88.8 设备8,1610036808041,73.5 设备1,1610036897060,18.0 设备7,1610036980127,14.9 设备2,1610037069523,47.4 设备4,1610037154507,59.5 设备5,1610037235099,35.0 设备6,1610037317868,76.4 设备2,1610037403367,10.0 设备2,1610037484177,18.5 设备4,1610037571384,98.7 设备5,1610037653666,95.6 设备6,1610037735520,32.6 设备6,1610037823906,83.3 设备3,1610037913756,29.1 设备7,1610037994980,74.6 设备6,1610038081606,22.2 设备3,1610038163043,10.4 设备5,1610038244717,56.9 设备3,1610038326227,64.8 设备4,1610038411053,65.0 设备8,1610038500538,93.2 设备8,1610038583924,76.2 设备1,1610038670150,42.1 设备5,1610038756839,35.1 设备3,1610038840180,75.9 设备3,1610038929751,83.4 设备7,1610039019422,24.1 设备3,1610039101778,85.0 设备8,1610039183077,45.6 设备3,1610039264498,79.5 设备1,1610039351600,44.4 设备8,1610039434187,73.3 设备3,1610039518048,77.9 设备7,1610039598556,9.79 设备4,1610039679144,19.0 设备2,1610039761967,56.1 设备3,1610039847823,88.2 设备6,1610039933024,77.4 设备7,1610040014212,14.4 设备4,1610040101627,98.2 设备8,1610040182379,85.0 设备6,1610040265210,61.8 设备2,1610040345769,48.0 设备3,1610040432855,19.9 设备4,1610040515943,30.9 设备4,1610040601373,51.7 设备1,1610040681803,29.7 设备8,1610040770779,31.6 设备3,1610040851986,67.1 设备4,1610040941421,93.2 设备7,1610041022836,37.2 设备8,1610041105401,84.6 设备6,1610041189301,19.2 设备4,1610041270735,99.0 设备4,1610041354109,77.0 设备5,1610041435113,49.7 设备1,1610041521773,74.2 设备8,1610041603035,42.2 设备3,1610041687230,87.1 设备1,1610041767985,82.7 设备3,1610041848130,0.59 设备4,1610041933021,7.38 设备2,1610042016080,28.9 设备2,1610042103229,99.2 设备2,1610042190222,42.2 设备3,1610042277841,12.0 设备7,1610042364076,93.5 设备7,1610042444652,10.5 设备4,1610042530461,68.5 设备1,1610042615421,78.2 设备3,1610042702219,18.5 设备6,1610042787478,64.8 设备5,1610042874301,6.34 设备2,1610042956073,65.6 设备8,1610043038793,10.6 设备8,1610043122971,30.3 设备7,1610043203810,17.5 设备8,1610043291566,83.8 设备5,1610043373188,30.5 设备2,1610043456107,84.7 设备1,1610043545998,53.4 设备3,1610043627174,97.4 */ 输出结果: SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/D:/.m2/repository/org/slf4j/slf4j-log4j12/1.7.10/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/D:/.m2/repository/ch/qos/logback/logback-classic/1.2.0/logback-classic-1.2.0.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory] 17:19:42,659 WARN org.apache.flink.runtime.taskmanager.TaskManagerLocation - No hostname could be resolved for the IP address 127.0.0.1, using IP address as host name. Local input split assignment (such as for HDFS files) may be impacted. 17:19:42,725 WARN org.apache.flink.runtime.taskmanager.TaskManagerLocation - No hostname could be resolved for the IP address 127.0.0.1, using IP address as host name. Local input split assignment (such as for HDFS files) may be impacted. 17:19:43,088 WARN org.apache.flink.runtime.webmonitor.WebMonitorUtils - Log file environment variable 'log.file' is not set. 17:19:43,089 WARN org.apache.flink.runtime.webmonitor.WebMonitorUtils - JobManager log files are unavailable in the web dashboard. Log file location not found in environment variable 'log.file' or configuration key 'Key: 'web.log.path' , default: null (fallback keys: [{key=jobmanager.web.log.path, isDeprecated=true}])'. high> (设备8,84.3) main> SensorReading(设备5,1610035371758,38.8) main> SensorReading(设备5,1610035458637,60.2) main> SensorReading(设备1,1610035543127,10.2) main> SensorReading(设备7,1610035623427,51.6) main> SensorReading(设备5,1610035705302,20.1) main> SensorReading(设备5,1610035787387,12.9) high> (设备7,88.2) main> SensorReading(设备6,1610035960537,33.5) main> SensorReading(设备7,1610036043040,63.0) main> SensorReading(设备5,1610036125179,64.5) main> SensorReading(设备6,1610036214972,30.2) main> SensorReading(设备5,1610036296542,56.5) main> SensorReading(设备7,1610036377999,29.7) main> SensorReading(设备6,1610036467523,59.4) high> (设备4,71.1) main> SensorReading(设备5,1610036641100,28.2) high> (设备2,88.8) high> (设备8,73.5) main> SensorReading(设备1,1610036897060,18.0) main> SensorReading(设备7,1610036980127,14.9) main> SensorReading(设备2,1610037069523,47.4) main> SensorReading(设备4,1610037154507,59.5) main> SensorReading(设备5,1610037235099,35.0) high> (设备6,76.4) main> SensorReading(设备2,1610037403367,10.0) main> SensorReading(设备2,1610037484177,18.5) high> (设备4,98.7) high> (设备5,95.6) main> SensorReading(设备6,1610037735520,32.6) high> (设备6,83.3) main> SensorReading(设备3,1610037913756,29.1) high> (设备7,74.6) main> SensorReading(设备6,1610038081606,22.2) main> SensorReading(设备3,1610038163043,10.4) main> SensorReading(设备5,1610038244717,56.9) main> SensorReading(设备3,1610038326227,64.8) main> SensorReading(设备4,1610038411053,65.0) high> (设备8,93.2) high> (设备8,76.2) main> SensorReading(设备1,1610038670150,42.1) main> SensorReading(设备5,1610038756839,35.1) high> (设备3,75.9) high> (设备3,83.4) main> SensorReading(设备7,1610039019422,24.1) high> (设备3,85.0) main> SensorReading(设备8,1610039183077,45.6) high> (设备3,79.5) main> SensorReading(设备1,1610039351600,44.4) high> (设备8,73.3) high> (设备3,77.9) low> (设备7,9.79) main> SensorReading(设备4,1610039679144,19.0) main> SensorReading(设备2,1610039761967,56.1) high> (设备3,88.2) high> (设备6,77.4) main> SensorReading(设备7,1610040014212,14.4) high> (设备4,98.2) high> (设备8,85.0) main> SensorReading(设备6,1610040265210,61.8) main> SensorReading(设备2,1610040345769,48.0) main> SensorReading(设备3,1610040432855,19.9) main> SensorReading(设备4,1610040515943,30.9) main> SensorReading(设备4,1610040601373,51.7) main> SensorReading(设备1,1610040681803,29.7) main> SensorReading(设备8,1610040770779,31.6) main> SensorReading(设备3,1610040851986,67.1) high> (设备4,93.2) main> SensorReading(设备7,1610041022836,37.2) high> (设备8,84.6) main> SensorReading(设备6,1610041189301,19.2) high> (设备4,99.0) high> (设备4,77.0) main> SensorReading(设备5,1610041435113,49.7) high> (设备1,74.2) main> SensorReading(设备8,1610041603035,42.2) high> (设备3,87.1) high> (设备1,82.7) low> (设备3,0.59) low> (设备4,7.38) main> SensorReading(设备2,1610042016080,28.9) high> (设备2,99.2) main> SensorReading(设备2,1610042190222,42.2) main> SensorReading(设备3,1610042277841,12.0) high> (设备7,93.5) main> SensorReading(设备7,1610042444652,10.5) main> SensorReading(设备4,1610042530461,68.5) high> (设备1,78.2) main> SensorReading(设备3,1610042702219,18.5) main> SensorReading(设备6,1610042787478,64.8) low> (设备5,6.34) main> SensorReading(设备2,1610042956073,65.6) main> SensorReading(设备8,1610043038793,10.6) main> SensorReading(设备8,1610043122971,30.3) main> SensorReading(设备7,1610043203810,17.5) high> (设备8,83.8) main> SensorReading(设备5,1610043373188,30.5) high> (设备2,84.7) main> SensorReading(设备1,1610043545998,53.4) high> (设备3,97.4) Process finished with exit code 0

优秀的个人博客,低调大师

多平台Docker镜像构建教程

云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! Adrian Mouat被誉为Docker Captain,他是Container Solutions 公司的首席科学家。目前,他正开发 Trow,这是一个容器镜像注册中心,用于安全管理 Kubernetes 集群中的镜像流。 当前,Docker 镜像已经成为测试和部署新的第三方软件的标准工具。Adrian 是开源 Trow 注册中心的主要开发者,而Docker 镜像则是人们安装该工具的主要方式。如果他不提供镜像,其他人最终也会推出他们自己的镜像,这样会导致重复"造轮子”,并产生维护问题。 默认情况下,我们创建的Docker 镜像运行在 linux/amd64 平台上。它适用于大多数的开发机器和云提供商,但却忽略其他平台的用户。这个群体很庞大——想想基于树莓派的家庭实验室、生产物联网设备的公司、运行在 IBM 大型机上的组织以及使用低功耗 arm64 芯片的云。 一般来说,这些平台的用户通常会构建自己的镜像或寻找其他解决方案。 那么,你该如何为这些平台构建镜像?最明显的方法是在目标平台上构建镜像。这适用于很多情况。但是如果你的目标是 s390x,我希望你有可以使用的 IBM 大型机。更常见的平台,比如树莓派、物联网设备通常电量有限,速度慢或无法构建镜像。 我们该怎么做?有两个选项:1. 目标平台仿真,2. 交叉编译。有趣的是,我发现有种方法可以将这两个选项结合的效果最好。 1.仿真 让我们从第一个选项——仿真开始。有一个很不错的项目叫 QEMU,它可以模拟很多平台。随着最近 buildx 的预览,将 QEMU 用于 Docker 变得更加容易。 https://www.qemu.org/ https://github.com/docker/buildx QEMU 集成依赖于一个 Linux 内核特性,该特性有个稍显神秘的名字 binfmt_misc handler。当 Linux 遇到其无法识别的可执行文件格式(例如,一个用于不同体系结构的文件格式)时,它将使用该处理程序检查是否配置了什么“用户空间应用程序”来处理该格式(例如,模拟器或 VM)。如果有,它将把可执行文件传递给该应用程序。 为实现这一点,我们需要在内核中注册我们关注的平台。如果你正在使用 Docker Desktop,那么对于大多数常见平台,你就无需做这项工作。如果你正使用 Linux,你可以通过运行最新的docker/binfmt镜像,以与 Docker Desktop 相同的方式注册处理程序,例如: docker run --privileged --rm docker/binfmt:a7996909642ee92942dcd6cff44b9b95f08dad64 完成此操作后,你可能需要重启 Docker。如果你想要对自己想注册的平台有更多控制或想使用更高深莫测的平台(例如 PowerPC),请查看 qus 项目。 https://github.com/dbhi/qus Buildx 有两种不同的用法,但最简单的方法可能是在 Docker CLI 上启用实验性特性(如果你还没有这样做的话),编辑~/.docker/config.json文件,使其包含以下内容: { ... "experimental": “enabled” } 你现在应该能运行docker buildx ls,并得到类似以下的输出: $ docker buildx ls NAME/NODE DRIVER/ENDPOINT STATUS PLATFORMS default docker default default running linux/amd64, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6 让我们为另一个平台构建一个镜像,从 Dockerfile 开始: FROM debian:buster CMD uname -m 如果我们正常构建,运行以下命令: $ docker buildx build -t local-build . … $ docker run --rm local-build x86_64 但是,如果我们显式指定构建针对的平台,则执行以下命令: $ docker buildx build --platform linux/arm/v7 -t arm-build . … $ docker run --rm arm-build armv7l 成功!我们已经成功地在 x86_64 笔记本上构建和运行了 armv7 镜像,并且只做了很少工作。这种技术很有效,但对于更复杂的构建,你可能会发现它运行太慢,或者遇到 QEMU 中的 Bug。在这些情况下,有必要研究一下是否可以交叉编译你的镜像。 2.交叉编译 一些编译器能为 foreign platforms 生成二进制代码,最著名的包括 Go 和 Rust。通过 Trow 注册中心项目,我们发现,交叉编译是为其他平台创建镜像最快、最可靠的方法。例如,这里是 Trow armv7 镜像的 Dockerfile。 https://github.com/ContainerSolutions/trow/blob/master/docker/Dockerfile.armv7 最重要的一行是: RUN cargo build --target armv7-unknown-linux-gnueabihf -Z unstable-options --out-dir ./out 它明确告诉 Rust,我们希望二进制文件在哪个平台上运行。然后,我们可以使用多级构建将这个二进制文件复制到目标体系结构的基本镜像中(如果是静态编译,也能使用 scratch),这样就完成了。然而,对于 Trow 注册中心,我想在最终的镜像中设置更多东西,所以最后阶段实际上开始于: FROM --platform=linux/arm/v7 debian:stable-slim 因此,我实际上混合使用了仿真和交叉编译——交叉编译用来创建二进制文件,仿真用来运行和配置最终的镜像。 3.清单列表 在上面关于仿真的建议中,你可能已经注意到:我们使用--platform参数来设置构建平台,但是我们在 FROM 行中将镜像指定为 debian:buster。这看起来似乎没有意义——平台当然依赖于基本镜像以及它是如何构建的,而不是用户之后的决定。 这样做是因为 Docker 使用了一种叫做清单列表的东西。对于给定镜像,这些列表包含指向不同体系结构镜像的指针。因为官方的 debian 镜像有一个定义好的清单列表,当我在笔记本上拉取这个镜像时,我会自动获得 amd64 镜像,当我在树莓派上拉取它时,我将得到 armv7 镜像。 为了让用户满意,我们可以为自己的镜像创建清单。如果我们回到前面的例子,首先我们需要重新构建并将镜像推送到一个镜像库: $ docker buildx build --platform linux/arm/v7 -t amouat/arch-test:armv7 . … $ docker push amouat/arch-test:armv7 … $ docker buildx build -t amouat/arch-test:amd64 . … $ docker push amouat/arch-test:amd64 接下来,我们创建一个清单列表指向这两个单独的镜像,并推送它们: $ docker manifest create amouat/arch-test:blog amouat/arch-test:amd64 amouat/arch-test:armv7 Created manifest list docker.io/amouat/arch-test:blog $ docker manifest push amouat/arch-test:blog sha256:039dd768fc0758fbe82e3296d40b45f71fd69768f21bb9e0da02d0fb28c67648 现在,Docker 将拉取并运行适合当前平台的镜像: $ docker run amouat/arch-test:blog Unable to find image 'amouat/arch-test:blog' locally blog: Pulling from amouat/arch-test Digest: sha256:039dd768fc0758fbe82e3296d40b45f71fd69768f21bb9e0da02d0fb28c67648 Status: Downloaded newer image for amouat/arch-test:blog x86_64 有树莓派的读者可以试着运行这个镜像,并确认它确实能在那个平台上工作!回顾一下:并不是 Docker 镜像的所有用户都运行 amd64。使用 buildx 和 QEMU,只需额外少量工作就可以为这些用户提供支持。 【云栖号在线课堂】每天都有产品技术专家分享!课程地址:https://yqh.aliyun.com/live 立即加入社群,与专家面对面,及时了解课程最新动态!【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK 原文发布时间:2020-04-14本文作者:Adrian Mouat 本文来自:“InfoQ 微信公众号”,了解相关信息可以关注“InfoQ”

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册