首页 文章 精选 留言 我的

精选列表

搜索[多租户SaaS],共10000篇文章
优秀的个人博客,低调大师

多平台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”

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

Spring Boot -Shiro配置多Realm

核心类简介 xxxToken:用户凭证xxxFilter:生产token,设置登录成功,登录失败处理方法,判断是否登录连接等xxxRealm:依据配置的支持Token来认证用户信息,授权用户权限 核心配置 Shrio整体配置:ShrioConfig.java @Bean public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) { ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); shiroFilterFactoryBean.setSecurityManager(securityManager); Map<String,

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

Shell脚本-控制多主机操作

环境介绍 首先要做到各个主机之间无密ssh连接。这样会最大可能方便的控制。 脚本 命名为status #!/bin/bash params=$@ i=166 for((i=166;i<=169;i++));do echo -------s$i $params ------- ssh s$i "$params" done 测试 [root@s166 bin]# status java -version -------s166 java -version ------- bash: java: command not found -------s167 java -version ------- bash: java: command not found -------s168 java -version ------- bash: java: command not found -------s169 java -version ------- bash: java: command not found What?就给我看这个,它找不到这个命令,那我把它放到/usr/local/bin下 [root@s166 bin]# which java /home/fantj/jdk/bin/java [root@s166 bin]# ln -s /home/fantj/jdk/bin/java java javadoc javah javapackager javaws javac javafxpackager javap java-rmi.cgi [root@s166 bin]# ln -s /home/fantj/jdk/bin/java ./java [root@s166 bin]# ls java jps status xcall.sh [root@s166 bin]# status java -version -------s166 java -version ------- java version "1.8.0_171" Java(TM) SE Runtime Environment (build 1.8.0_171-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode) -------s167 java -version ------- bash: java: command not found -------s168 java -version ------- bash: java: command not found -------s169 java -version ------- bash: java: command not found 好了,jps同理,我们只需要把命令创建软连接到/usr/local/bin下即可,每个主机都需要设置的。 效果 [root@s166 bin]# status jps -------s166 jps ------- 12641 Jps 1397 NameNode 1559 SecondaryNameNode 1727 ResourceManager -------s167 jps ------- 1764 DataNode 11610 Jps 1823 NodeManager -------s168 jps ------- 11572 Jps 1815 NodeManager 1756 DataNode -------s169 jps ------- 1813 NodeManager 1754 DataNode 11548 Jps [root@s166 bin]# status ls ~/.ssh -------s166 ls /root/.ssh ------- authorized_keys id_rsa id_rsa.pub known_hosts -------s167 ls /root/.ssh ------- authorized_keys id_rsa id_rsa.pub known_hosts -------s168 ls /root/.ssh ------- authorized_keys id_rsa id_rsa.pub -------s169 ls /root/.ssh ------- authorized_keys id_rsa id_rsa.pub

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

Windows环境编译FFmpeg(多包)

编译环境是win10,ndk r14,ffmpeg3.0 1. 下载工具包 首先自然是下载NDK及FFmpeg并解压,Windows下编译需要下载MinGW 下载完毕后MinGW需要安装,安装好之后是个下载管理器,选择安装选项的时候要选上mingw-developer-toolkit,mingw32-gcc-ada,msys-base三项。 MinGW.png 2.编辑FFmpeg目录里的configure文件。找到 SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)' LIB_INSTALL_EXTRA_CMD='$(RANLIB) "$(LIBDIR)/$(LIBNAME)"' SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)' SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)' 修改为 SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)' LIB_INSTALL_EXTRA_CMD='$(RANLIB) "$(LIBDIR)/$(LIBNAME)"' SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)' SLIB_INSTALL_LINKS='$(SLIBNAME)' 这是为了修改文件名格式 3. 创建build_android.sh文件作为编译脚本 #!/bin/bash # NDK的路径,根据实际安装位置设置 NDK=D:/java/androidstudio/sdk/ndk-bundle # 编译针对的平台,这里选择最低支持android-14, arm架构,生成的so库是放在libs/armeabi文件夹下的,若针对x86架构,要选择arch-x86 PLATFORM=$NDK/platforms/android-14/arch-arm # 工具链的路径,arm-linux-androideabi-4.9与上面设置的PLATFORM对应,4.9为工具的版本号 TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64 function build_one { ./configure \ --prefix=$PREFIX \ --enable-shared \ --disable-static \ --disable-doc \ --disable-ffmpeg \ --disable-ffplay \ --disable-ffprobe \ --disable-ffserver \ --disable-doc \ --disable-symver \ --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \ --target-os=linux \ --arch=arm \ --enable-cross-compile \ --sysroot=$PLATFORM \ --extra-cflags="-I$PLATFORM/usr/include" \ make clean make -j4 make install } # arm v7vfp CPU=armv7-a OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU " PREFIX=./android/$CPU ADDITIONAL_CONFIGURE_FLAG= build_one # CPU=armv # PREFIX=$(pwd)/android/$CPU # ADDI_CFLAGS="-marm" # build_one #arm v6 #CPU=armv6 #OPTIMIZE_CFLAGS="-marm -march=$CPU" #PREFIX=./android/$CPU #ADDITIONAL_CONFIGURE_FLAG= #build_one #arm v7vfpv3 # CPU=armv7-a # OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=$CPU " # PREFIX=./android/$CPU # ADDITIONAL_CONFIGURE_FLAG= # build_one #arm v7n #CPU=armv7-a #OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=neon -marm -march=$CPU -mtune=cortex-a8" #PREFIX=./android/$CPU #ADDITIONAL_CONFIGURE_FLAG=--enable-neon #build_one #arm v6+vfp #CPU=armv6 #OPTIMIZE_CFLAGS="-DCMP_HAVE_VFP -mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU" #PREFIX=./android/${CPU}_vfp #ADDITIONAL_CONFIGURE_FLAG= #build_one } # arm v7vfp CPU=armv7-a OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU " PREFIX=./android/$CPU-vfp ADDITIONAL_CONFIGURE_FLAG= build_one # CPU=armv # PREFIX=$(pwd)/android/$CPU # ADDI_CFLAGS="-marm" # build_one #arm v6 #CPU=armv6 #OPTIMIZE_CFLAGS="-marm -march=$CPU" #PREFIX=./android/$CPU #ADDITIONAL_CONFIGURE_FLAG= #build_one #arm v7vfpv3 # CPU=armv7-a # OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=$CPU " # PREFIX=./android/$CPU # ADDITIONAL_CONFIGURE_FLAG= # build_one #arm v7n #CPU=armv7-a #OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=neon -marm -march=$CPU -mtune=cortex-a8" #PREFIX=./android/$CPU #ADDITIONAL_CONFIGURE_FLAG=--enable-neon #build_one #arm v6+vfp #CPU=armv6 #OPTIMIZE_CFLAGS="-DCMP_HAVE_VFP -mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU" #PREFIX=./android/${CPU}_vfp #ADDITIONAL_CONFIGURE_FLAG= #build_one 其中要注意TMPDIR、NDK、TOOLCHAIN、--cross-prefix对应实际目录地址,可别漏了。 ./configure部分根据自己的需要调整功能。全要的话库文件未免太大。 --disable-avdevice \ 这一行控制了不输出libavdevice.so文件,即最后的输出目录中不存在这个.so文件 --enable-shared 这一行启动动态编译 --disable-static 这一行禁用静态编译 4.编译 运行C:\MinGW\msys\1.0目录下的msys.bat,cd到ffmpeg目录执行build_android.sh ./build_android.sh 5. 结果 等待十几分钟之后,控制台输出如下结果: 结果.png 6. 文件 在ffmpeg-3.3.6文件夹下生成一个android目录,目录下对应的是不同的架构,这里只生成了armv7-a这个目录,include中是头文件,lib中是生成.so文件,用的时候使用文件名贵上带数字的.so文件。 文件.png 详情.png

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

Android studio 多包名打包

首先公司有这样的需求一个项目需要给不同的人使用,就需要不同的启动页、logo、name这样的资源(不从网上获取)。最早还在eclipse的时候需要一个个的修改打包,在早期数量少的时候半天也能搞定,随着数量的增加就需要其他的方法来减少人力了。现在来介绍一下在Android studio中自带的打包方法 1实现同一包名不同启动页、logo、name的打包 1、首先需要在项目的src文件夹下建立相应的文件夹和你的main同级 图1.png 2、在项目的build.gradle中的Android下使用productFlavors 图2.png 3在build.gradle中配置签名文件 图3.png 这里简单说明一下storeFile是签名文件的路径我放在了app文件夹下和build.gradle文件目录同级就没有写相对路径 4、build一下项目后就会在右侧的gradle中看到 图4.png 双击相应的名字即可开始打包 2实现不同的包名打包 1、其他的步骤和上方的一致需要在1-2中的productFlavors添加 图5.png 重复上述打包即可 注意:如果适配了Android7.0的话应该都使用了FileProvider需要修改对应的authorities(修改后代码中的使用也需要统一修改,小心崩溃)否则两个应用无法安装到同一个手机上其他的provider标签以及自定义权限也需注意此问题, 这里给大家推荐一个朋友的Python自动打包 https://www.jianshu.com/p/b66d72862517 如有遗漏或不对的地方,敬请留言指正

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

filebeat多版本for Windows7

Filebeat是一个开源的文件收集器,主要用于获取日志文件,并把它们发送到logstash或elasticsearch。filebeat不仅支持各版本的Linux系统(centos5.6除外),在Windows操作系统上也有很好的体验。 下载: https://www.elastic.co/downloads/beats/filebeat 安装: 运行以下命令来安装Filebeat作为Windows服务,进入cmd控制台 cd ‘C:\Program Files\Filebeat’ C:\Program Files\Filebeat> .\install-service-filebeat.ps1 执行报错: 用以下命令执行: PowerShell.exe -ExecutionPolicy UnRestricted -File .\install-service-filebeat.ps1 安装完成后,修改filebeat.yml配置文件,指定好上传日志文件的路径等参数 启动: 直接执行.exe程序即可 但是这里有一个问题,程序只能前台运行,一旦关闭cmd窗口,程序也会关闭,google了很多办法,start /b参数尝试也不行,后来搜到一个chp.exe程序,加在filebeat.exe前执行即可。 测试了最新版本5.0,以及1.3和1.2的filebeat版本,只有1.2版本可以执行 1.3和5.0出现输出报错: failedtoinitializeconsolepluginasoutput:consoleoutputinitializationfailedwith:GetFileInformationByHandle/dev/stdout:Thehandleisinvalid.

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

logstash输出到elasticsearch多索引

目标:将json格式的两类日志输出到elasticsearch两类索引 1. 安装logstash。 2. 编写logstash处理配置文件,创建一个test.conf文件,内容如下: input { file { path => "/home/vagrant/logstash/logstash-2.2.2/dbpool-logs/dev/common-sql-*.log" start_position => "beginning" type => "sql" codec => json { charset => "UTF-8" } } file { path => "/home/vagrant/logstash/logstash-2.2.2/dbpool-logs/dev/common-transaction-*.log" start_position => "beginning" type => "transaction" codec => json { charset => "UTF-8" } } } output { if "_grokparsefailure" in [tags] { }else{ if [type] == "sql"{ elasticsearch { hosts => ["http://192.168.33.10:9200"] index => "common-sql-%{+YYYY.MM.dd}" } } if [type] == "transaction"{ elasticsearch { hosts => ["http://192.168.33.10:9200"] index => "common-transaction-%{+YYYY.MM.dd}" } } } } 或者 input { file { path => "/home/vagrant/logstash/logstash-2.2.2/dbpool-logs/dev/common-sql-*.log" start_position => "beginning" type => "sql" codec => json { charset => "UTF-8" } } file { path => "/home/vagrant/logstash/logstash-2.2.2/dbpool-logs/dev/common-transaction-*.log" start_position => "beginning" type => "transaction" codec => json { charset => "UTF-8" } } } output { if "_grokparsefailure" in [tags] { }else{ if [type] == "sql"{ elasticsearch { hosts => ["http://192.168.33.10:9200"] index => "common-%{type}-%{+YYYY.MM.dd}" } } } } 指定输入日志的路径,按通配符匹配。分为两类:sql和transaction。 根据type分别输出到elasticsearch不同的索引。 3. 安装elasticsearch。 4. 启动elasticsearch,./bin/elasticsearch -d ,默认端口为9200。 5. 启动logstash开始处理,./bin/logstash -f conf/test.conf。 6. 完成。 ========广告时间======== 鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以到 https://item.jd.com/12185360.html 进行预定。感谢各位朋友。 为什么写《Tomcat内核设计剖析》 =========================

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

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

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

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

用户登录
用户注册