伟的小站 http://www.itfsw.com/blog 因为简单所以纯粹 Tue, 02 Nov 2021 07:01:56 +0000 zh-CN hourly 1 https://wordpress.org/?v=5.8.1 SuperMap iObjects Java在64位Linux上安装许可驱动报The 32bit support is missing. Please install the x86 compatibility http://www.itfsw.com/blog/post/2021/11/02/supermap-iobjects-java-installs-the-32bit-support-is-missing-please-install-the-x86-compatibility/ http://www.itfsw.com/blog/post/2021/11/02/supermap-iobjects-java-installs-the-32bit-support-is-missing-please-install-the-x86-compatibility/#respond Tue, 02 Nov 2021 07:01:49 +0000 http://www.itfsw.com/blog/?p=1047 最近项目整合部署时需要做一个包含超图、GDAL、LAS等动态库的基础镜像,镜像是基于GDAL做的,由于是Ubu […]

The post SuperMap iObjects Java在64位Linux上安装许可驱动报The 32bit support is missing. Please install the x86 compatibility appeared first on 伟的小站.

]]>
最近项目整合部署时需要做一个包含超图、GDAL、LAS等动态库的基础镜像,镜像是基于GDAL做的,由于是Ubuntu64位,所以安装超图许可驱动时报了如下错误:

dpkg-query: no packages found matching aksusbd
The 32bit support is missing. Please install the x86 compatibility
packages required by your distribution and retry the installation.
See the installation guide for more details.
Aborting...

网上找了半天也不知道他究竟是缺了哪些32位依赖包,看了几篇解决方案发现都是在安装libc6的32位版本,所以尝试安装lib32z1 果然再次安装就正常了。

apt-get install lib32z1

The post SuperMap iObjects Java在64位Linux上安装许可驱动报The 32bit support is missing. Please install the x86 compatibility appeared first on 伟的小站.

]]>
http://www.itfsw.com/blog/post/2021/11/02/supermap-iobjects-java-installs-the-32bit-support-is-missing-please-install-the-x86-compatibility/feed/ 0
Axios的POST请求按需采用Form或者JSON传输请求数据 http://www.itfsw.com/blog/post/2021/08/27/the-post-request-of-axios-uses-form-or-json-to-transfer-the-requested-data-on-demand/ http://www.itfsw.com/blog/post/2021/08/27/the-post-request-of-axios-uses-form-or-json-to-transfer-the-requested-data-on-demand/#respond Fri, 27 Aug 2021 03:27:22 +0000 http://www.itfsw.com/blog/?p=1011 公司更新了后台接口规范,POST请求参数数量3个及以上必须采用@RequestBody接收,3个以下可灵活使用 […]

The post Axios的POST请求按需采用Form或者JSON传输请求数据 appeared first on 伟的小站.

]]>
公司更新了后台接口规范,POST请求参数数量3个及以上必须采用@RequestBody接收,3个以下可灵活使用json或者formdata传参,所以造成前端post请求某些采用json某些使用的是formdata。所以前端Axios需做适应性改造。

还好我们知道Axios是有一个前置请求拦截器的,所以封装的Axios工具类中我们可以根据接口配置采用不同的数据传输方式,具体我们根据传入的dataType类型来拦截,如果配置了类型为“form”,则拦截器中转换请求方式到form传输,拦截器代码:

import axios from 'axios'
import qs from 'qs'

// 创建axios实例
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // api 的 base_url
  timeout: 15000 // 请求超时时间
})

// 请求 拦截器
service.interceptors.request.use(config => {
  // POST 请求采用 form表单还是 json 上传,默认json, 有特殊配置则改为form
  if (config.method.toUpperCase() === 'POST' && config.dataType && config.dataType.toUpperCase() === 'FORM') {
    config.headers['Content-Type'] = 'application/x-www-form-urlencoded'
    config.transformRequest = [data => qs.stringify(data)]
  }
  return config
})

The post Axios的POST请求按需采用Form或者JSON传输请求数据 appeared first on 伟的小站.

]]>
http://www.itfsw.com/blog/post/2021/08/27/the-post-request-of-axios-uses-form-or-json-to-transfer-the-requested-data-on-demand/feed/ 0
构建Docker镜像时,如项目需使用GNI或者动态库,基础镜像慎用Alpine Linux http://www.itfsw.com/blog/post/2021/08/24/when-building-docker-image-if-the-project-needs-to-use-gni-or-dynamic-library-the-basic-image/ http://www.itfsw.com/blog/post/2021/08/24/when-building-docker-image-if-the-project-needs-to-use-gni-or-dynamic-library-the-basic-image/#respond Tue, 24 Aug 2021 03:07:31 +0000 http://www.itfsw.com/blog/?p=1001 在构建Docker镜像时,为了保持最终镜像的大小一般习惯选用Alpine Linux作为基础镜像,但是如果你的 […]

The post 构建Docker镜像时,如项目需使用GNI或者动态库,基础镜像慎用Alpine Linux appeared first on 伟的小站.

]]>
在构建Docker镜像时,为了保持最终镜像的大小一般习惯选用Alpine Linux作为基础镜像,但是如果你的项目使用了动态链接库的情况下一定要谨慎选择。我们一个项目中动态库基于C++6构建,结果发现动态库依赖报错,使用ldd命令检查依赖,发现其中报了Error loading shared library libgcc_s.so.1: No such file or directory 和Error loading shared library ld-linux-x86-64.so.2: No such file or directory

其中的libgcc依赖好解决,直接安装apk add libstdc++ 就可以,但是ld-linux-x86-64.so.2 他是属于glibc里的,在Alpine里无法找到,网上差了原因是因为Alpine linux使用的是musl,与常见的glibc不同,Musl是一个轻量级的C标准库,基本上只能通过手动编译安装十分麻烦。

果断替换基础镜像到Buster:buster是基于Debian Linux发行的一个版本,这个版本比较新,支持比较全面,受广大Debian爱好者的好评!所以像PHP、Python之类的语言、应用都会使用这个版本的Debian搭建Docker基础镜像。

The post 构建Docker镜像时,如项目需使用GNI或者动态库,基础镜像慎用Alpine Linux appeared first on 伟的小站.

]]>
http://www.itfsw.com/blog/post/2021/08/24/when-building-docker-image-if-the-project-needs-to-use-gni-or-dynamic-library-the-basic-image/feed/ 0
解决Docker项目报javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)异常的问题 http://www.itfsw.com/blog/post/2021/08/23/jiejue-docker-javax-net-ssl-sslhandshakeexception-no-appropriate-protocol/ http://www.itfsw.com/blog/post/2021/08/23/jiejue-docker-javax-net-ssl-sslhandshakeexception-no-appropriate-protocol/#respond Mon, 23 Aug 2021 07:11:01 +0000 http://www.itfsw.com/blog/?p=999 最近使用Docker部署Springboot项目遇到连接数据库报javax.net.ssl.SSLHandsh […]

The post 解决Docker项目报javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)异常的问题 appeared first on 伟的小站.

]]>
最近使用Docker部署Springboot项目遇到连接数据库报javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate) 异常的问题,网上找的原因是由于java通过安全更新已经在8或者8+的小版本中禁用了不安全的TLSv1&TLSv1.1,而我们的项目由于使用很老版本的Mysql数据库,所以导致报错。

网上提供的解决方案是通过修改jre下java.security文件中的jdk.tls.disabledAlgorithms配置,删除掉TLSv1&TLSv1.1来解决,但项目使用Docker容器来部署不可能每次修改该文件,下面提供结局方案。

方案一:使用linux发行版中的openjdk,目前Linux发行版中的配置不知为什么还没有去掉该配置,我们可以通过白的Linux镜像来安装openjdk。

FROM alpine:3.12

# 替换阿里源
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN apk update

# env
ENV LANG='en_US.UTF-8' LANGUAGE='en_US:en' LC_ALL='en_US.UTF-8'
ENV JAVA_VERSION 11
ENV JAVA_TOOL_OPTIONS="-XX:+IgnoreUnrecognizedVMOptions -XX:+UseContainerSupport -XX:+IdleTuningCompactOnIdle -XX:+IdleTuningGcOnIdle"
ENV JAVA_HOME="/usr/lib/jvm/java-11-openjdk"

# 一些openjdk官方docker安装了的包
RUN apk add bzip2 unzip p11-kit
# openjdk
RUN apk add openjdk11

# 清理apk缓存
RUN rm -rf /var/cache/apk/*

# ADD
ADD target/demo.jar /app.jar

EXPOSE 8080
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-Xms256m", "-Xmx512m", "-jar", "/app.jar"]

方案二:构建时替换java.security配置,这种方式试用性更广,基于openjdk镜像的如tomcat等镜像也能用。

FROM openjdk:11-jdk

# ADD
ADD target/demo.jar /app.jar

# 解决不支持TLSv1 & TLSv1.1 问题
# 根据基础镜像不同,配置文件位置也不同
RUN sed -i 's/jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1/jdk.tls.disabledAlgorithms=SSLv3/g' /usr/local/openjdk-11/conf/security/java.security

EXPOSE 8080
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-Xms256m", "-Xmx512m", "-jar", "/app.jar"]

The post 解决Docker项目报javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)异常的问题 appeared first on 伟的小站.

]]>
http://www.itfsw.com/blog/post/2021/08/23/jiejue-docker-javax-net-ssl-sslhandshakeexception-no-appropriate-protocol/feed/ 0
如何在构建Docker镜像时加入动态库(.so) http://www.itfsw.com/blog/post/2021/08/20/how-to-add-a-dynamic-library-so-when-building-a-docker-image/ http://www.itfsw.com/blog/post/2021/08/20/how-to-add-a-dynamic-library-so-when-building-a-docker-image/#respond Fri, 20 Aug 2021 09:27:48 +0000 http://www.itfsw.com/blog/?p=994 平时在Linux上需要添加项目的动态库文件只需要把.so文件放入/lib64/下并执行ldconfig命令就可 […]

The post 如何在构建Docker镜像时加入动态库(.so) appeared first on 伟的小站.

]]>
平时在Linux上需要添加项目的动态库文件只需要把.so文件放入/lib64/下并执行ldconfig命令就可以让程序识别到动态库文件,但我们通过Dockerfile执行相同操作时却无法正常加载动态库文件:

FROM openjdk:8u302-jdk

# 安装动态库文件
ADD resources/lib64/ /lib64/
RUN ldconfig

虽然镜像能构建但是代码加载时却出错,进入容器通过ldconfig -v 也无法找到对应的动态库,还好我们可以通过容器LD_LIBRARY_PATH 环境变量解决该问题:

FROM openjdk:8u302-jdk

# 安装动态库文件
ADD resources/lib64/ /usr/local/myso/
ENV LD_LIBRARY_PATH=/usr/local/myso/:$LD_LIBRARY_PATH

The post 如何在构建Docker镜像时加入动态库(.so) appeared first on 伟的小站.

]]>
http://www.itfsw.com/blog/post/2021/08/20/how-to-add-a-dynamic-library-so-when-building-a-docker-image/feed/ 0
Vue整合新版本Cesium(1.63+) http://www.itfsw.com/blog/post/2021/08/12/vue-zhenghe-xin-banben-cesium-1-63/ http://www.itfsw.com/blog/post/2021/08/12/vue-zhenghe-xin-banben-cesium-1-63/#respond Thu, 12 Aug 2021 03:00:27 +0000 http://192.168.31.110:88/blog/?p=940 Cesium在1.63进行了一次重大重构,项目从AMD模块转向原生JS ES6模块,具体可以查看官方博客Ces […]

The post Vue整合新版本Cesium(1.63+) appeared first on 伟的小站.

]]>
Cesium在1.63进行了一次重大重构,项目从AMD模块转向原生JS ES6模块,具体可以查看官方博客CesiumJS Migrates to ES6 Modules ,所以以前老的Vue整合Cesium的方式都没法用了,这里是新版本整合方式。

一、首先还是安装必要依赖,和普通vue项目一样添加上Cesium最新版本。注意devDependencies中和老版本一样要增加一个copy-webpack-plugin用于拷贝Cesium的一些静态资源。

{
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint"
  },
  "dependencies": {
    "cesium": "^1.84.0",
    "core-js": "^3.6.5",
    "vue": "^2.6.11",
    "vue-router": "^3.2.0",
    "vuex": "^3.4.0"
  },
  "devDependencies": {
    "@vue/cli-plugin-babel": "~4.5.0",
    "@vue/cli-plugin-eslint": "~4.5.0",
    "@vue/cli-plugin-router": "~4.5.0",
    "@vue/cli-plugin-vuex": "~4.5.0",
    "@vue/cli-service": "~4.5.0",
    "@vue/eslint-config-standard": "^5.1.2",
    "babel-eslint": "^10.1.0",
    "copy-webpack-plugin": "^6.0.3",
    "eslint": "^6.7.2",
    "eslint-plugin-import": "^2.20.2",
    "eslint-plugin-node": "^11.1.0",
    "eslint-plugin-promise": "^4.2.1",
    "eslint-plugin-standard": "^4.0.0",
    "eslint-plugin-vue": "^6.2.2",
    "sass": "^1.26.5",
    "sass-loader": "^8.0.2",
    "vue-template-compiler": "^2.6.11"
  }
}

二、配置vue.config.js,增加Cesium打包的一些配置,如拷贝静态资源、定义CESIUM_BASE_URL打包常量等。

const webpack = require('webpack')
const CopyWebpackPlugin = require('copy-webpack-plugin')

module.exports = {
  publicPath: '/demo',
  productionSourceMap: false,
  configureWebpack: {
    plugins: [
      // Copy Cesium Assets, Widgets, and Workers to a static directory
      new CopyWebpackPlugin({
        patterns: [
          { from: 'node_modules/cesium/Build/Cesium/Workers', to: 'Workers' },
          { from: 'node_modules/cesium/Build/Cesium/ThirdParty', to: 'ThirdParty' },
          { from: 'node_modules/cesium/Build/Cesium/Assets', to: 'Assets' },
          { from: 'node_modules/cesium/Build/Cesium/Widgets', to: 'Widgets' }
        ]
      }),
      new webpack.DefinePlugin({
        // Define relative base path in cesium for loading assets
        CESIUM_BASE_URL: JSON.stringify('')
      })
    ],
    module: {
      // 解决Cesium 构建warning Critical dependency: require function is used in a way in which dependencies cannot be statically extracted
      unknownContextCritical: false,
      unknownContextRegExp: /\/node_modules\/cesium\/Source\/Core\/buildModuleUrl\.js/
    }
  }
}

三、main.js全局引入Cesium Widgets 样式。

import 'cesium/Build/Cesium/Widgets/widgets.css'

四、修改以前Cesium引入方式。

// 修改以前Cesium引入方式:import Cesium from 'cesium/Cesium' 为
import * as Cesium from 'cesium'
// 现在你也可以单独引入Cesium的某个类
import { Billboard } from 'cesium'

伍、Demo。

<template>
  <div id="map"></div>
</template>
<script>
import * as Cesium from 'cesium'

export default {
  name: 'About',
  data () {
    return {
      $_viewer: null
    }
  },
  mounted () {
    this.$_viewer = new Cesium.Viewer('map')
  }
}
</script>
<style lang="scss" scoped>
#map{
  width: 100%;
  height: 100%;
}
</style>

The post Vue整合新版本Cesium(1.63+) appeared first on 伟的小站.

]]>
http://www.itfsw.com/blog/post/2021/08/12/vue-zhenghe-xin-banben-cesium-1-63/feed/ 0
Jenkins部署项目到Kubernetes(使用kubectl) http://www.itfsw.com/blog/post/2021/08/06/jenkins-bushu-xiangmu-dao-kubernetes-shiyong-kubectl/ http://www.itfsw.com/blog/post/2021/08/06/jenkins-bushu-xiangmu-dao-kubernetes-shiyong-kubectl/#respond Fri, 06 Aug 2021 09:52:25 +0000 http://192.168.31.110:88/blog/?p=936 最近需要通过Jenkins实现自动化部署项目到Kubernetes,由于k8s集群使用的是Rancher,已经 […]

The post Jenkins部署项目到Kubernetes(使用kubectl) appeared first on 伟的小站.

]]>
最近需要通过Jenkins实现自动化部署项目到Kubernetes,由于k8s集群使用的是Rancher,已经获取到kubecofig文件(从Rancher中获取Kubeconfig文件),可是使用Jenkins上的Kubernetes插件死活连不上集群。没办法临时在Jenkins服务器上安装kubectl工具来部署项目。

一、由于Jenkins是采用Docker部署的,首先进入容器安装kubectl工具,为了防止Rancher又扯拐,直接用Rancher自己的kubectl下载地址下载:

# 安装kubectl
curl -o /usr/local/bin/kubectl http://rancher-mirror.cnrancher.com/kubectl/v1.16.15/linux-amd64-v1.16.15-kubectl
chmod +x /usr/local/bin/kubectl
ln -s /usr/local/bin/kubectl /usr/bin/kubectl

二、把从Rancher下载的kubeconfig文件保存到~/.kube/config

三、通过Jenkins项目执行shell kubectl get all 判断是否连接成功,成功后具体项目就可以通过kubectl进行项目发布部署了;

遗留的问题:对于有多个k8s集群的环境,虽然可以通过kubectl config use-context xxxxx 切换集群环境,但是由于对于Jenkins可以多个任务同时执行,此时环境是不可控的。

The post Jenkins部署项目到Kubernetes(使用kubectl) appeared first on 伟的小站.

]]>
http://www.itfsw.com/blog/post/2021/08/06/jenkins-bushu-xiangmu-dao-kubernetes-shiyong-kubectl/feed/ 0
从Rancher中获取Kubeconfig文件 http://www.itfsw.com/blog/post/2021/08/05/cong-rancher-zhong-huoqu-kubeconfig-wenjian/ http://www.itfsw.com/blog/post/2021/08/05/cong-rancher-zhong-huoqu-kubeconfig-wenjian/#respond Thu, 05 Aug 2021 11:46:30 +0000 http://192.168.31.110:88/blog/?p=933 由于公司的Kubernetes集群是基于Rancher搭建的,而实际使用时还是习惯用kubectl密令来发布部 […]

The post 从Rancher中获取Kubeconfig文件 appeared first on 伟的小站.

]]>
由于公司的Kubernetes集群是基于Rancher搭建的,而实际使用时还是习惯用kubectl密令来发布部署。所以需要从Rancher中取得Kubeconfig文件来连接服务器。Rancher可以管理多个Kubernetes集群,所以需要主页面切换到具体某个集群,然后点击头部集群菜单就能在右上角找到配置文件:

The post 从Rancher中获取Kubeconfig文件 appeared first on 伟的小站.

]]>
http://www.itfsw.com/blog/post/2021/08/05/cong-rancher-zhong-huoqu-kubeconfig-wenjian/feed/ 0
Jenkins部署Kubernetes异常:YAMLException: Class not found: io.kubernetes.client.openapi.models.V1Deployment http://www.itfsw.com/blog/post/2021/08/05/jenkins-bushu-kubernetes-yichang-yamlexception-class-not-found-io-kubernetes-client-openapi-models/ http://www.itfsw.com/blog/post/2021/08/05/jenkins-bushu-kubernetes-yichang-yamlexception-class-not-found-io-kubernetes-client-openapi-models/#respond Thu, 05 Aug 2021 11:38:10 +0000 http://192.168.31.110:88/blog/?p=930 Jenkins部署Kubernetes异常:YAMLException: Class not found: i […]

The post Jenkins部署Kubernetes异常:YAMLException: Class not found: io.kubernetes.client.openapi.models.V1Deployment appeared first on 伟的小站.

]]>
Jenkins部署Kubernetes异常:YAMLException: Class not found: io.kubernetes.client.openapi.models.V1Deployment ,老版本都是能正常部署的,应该是升级插件后导致的。网上找了很多解决办法,都提到Jackson 2 API,Snakeyaml API两个升级导致的,实测果然……

具体可以参考这个issues https://github.com/jenkinsci/kubernetes-cd-plugin/issues/134

The post Jenkins部署Kubernetes异常:YAMLException: Class not found: io.kubernetes.client.openapi.models.V1Deployment appeared first on 伟的小站.

]]>
http://www.itfsw.com/blog/post/2021/08/05/jenkins-bushu-kubernetes-yichang-yamlexception-class-not-found-io-kubernetes-client-openapi-models/feed/ 0
Jenkins通过unix:///var/run/docker.sock访问docker报permission异常解决 http://www.itfsw.com/blog/post/2021/08/04/jenkins-tongguo-unix-var-run-docker-sock-fangwen-docker-bao-permission-yichang-jiejue/ http://www.itfsw.com/blog/post/2021/08/04/jenkins-tongguo-unix-var-run-docker-sock-fangwen-docker-bao-permission-yichang-jiejue/#respond Wed, 04 Aug 2021 07:37:34 +0000 http://192.168.31.110:88/blog/?p=928 我们通过Docker搭建了Jenkins服务,同时通过容器挂载了宿主机的/var/run/docker.soc […]

The post Jenkins通过unix:///var/run/docker.sock访问docker报permission异常解决 appeared first on 伟的小站.

]]>
我们通过Docker搭建了Jenkins服务,同时通过容器挂载了宿主机的/var/run/docker.sock到容器中,这样我们就可以通过unix:///var/run/docker.sock直接访问宿主机的Docker服务了。但是在实际使用过程中却发现Jenkins通过该方法访问docker.sock却报permission异常,就是权限不足。

网上一些方法通过赋予 /var/run/docker.sock 777 权限或者修改Jenkins容器使用root用户启动,但都不是太正规的方式。

下面是我的解决方案:

进入Jenkins容器,通过ls -l /var/run/docker.sock 命令我们可以看到docker.sock文件属于root用户982用户组,所以我们只需要把Jenkins用户加入该组就能解决问题!

# 通过ls命令查看/var/run/docker.sock所在用户组
ls -l /var/run/docker.sock
# 通过上述命令得到用户组id 为982,通过该id建立docker组
groupadd -g 982 docker
# 把当前Jenkins容器用户jenkins加入docker组
usermod -a -G docker jenkins

The post Jenkins通过unix:///var/run/docker.sock访问docker报permission异常解决 appeared first on 伟的小站.

]]>
http://www.itfsw.com/blog/post/2021/08/04/jenkins-tongguo-unix-var-run-docker-sock-fangwen-docker-bao-permission-yichang-jiejue/feed/ 0