1. 程式人生 > >weblogic docker容器化之自動釋出

weblogic docker容器化之自動釋出

因工作需要,需將weblogic製作為docker映象,現將過程記錄以便查閱。

weblogic映象製作,官方從12.1.3後,提供官方指令碼用於製作映象包括weblogic靜默安裝和weblogic靜默離線建立域。https://github.com/oracle/docker-images中提供各種官版映象製作指令碼。

沒有官方指令碼的版本,可以參考官方指令碼和百度“weblogic靜默安裝”製作映象。

此次需求完成重點不是weblogic映象製作,而是映象需要滿足自動專案釋出的需求。

因為web專案從weblogic jndi獲取資料來源,weblogic自動釋出需滿足自動建立資料來源,自動釋出指定目錄下的web專案。問題之處,認為weblogic可以通過更改config.xml檔案實現部署和資料來源建立,幾次折騰回頭看修改xml配置檔案的方式自己不能實現(估計就不能實現,很多配置項都是weblogic啟動後才會生成)。所以,直接給出結果weblogic的自動釋出通過weblogic.WLST提供的指令碼方法和python指令碼實現,weblogic.WLST支援python。

WLST官方資料:

http://www.beansoft.biz/weblogic/docs100/config_scripting/index.html

welbogic建立資料來源可以在離線(weblogic未啟動)情況下建立,而部署只能在weblogic啟動的情況下才能部署。所以指令碼分為三部分:1、離線建立資料來源2、啟動weblogic3、部署指定應用。

1、首先是建立docker容器啟動時執行的sh指令碼

#!/bin/bash

# WARNING: This file is created by the Configuration Wizard.
# Any changes to this script may be lost when adding extensions to this configuration.
echo "auto deploy start..."
source /u01/oracle/wlserver/server/bin/setWLSEnv.sh >/u01/initlog
java weblogic.WLST /u01/oracle/user_projects/domains/base_domain/bin/createWeblogicDataSource.py >>/u01/initlog &
echo "auto deploy start create data source end..."
wait
java weblogic.WLST /u01/oracle/user_projects/domains/base_domain/bin/deployWeblogicWebapp.py >>/u01/initlog &

DOMAIN_HOME="/u01/oracle/user_projects/domains/base_domain"

${DOMAIN_HOME}/bin/startWebLogic.sh $*
指令碼解釋:

1、載入WLST需要的環境變數(weblogic安裝目錄下)

2、啟動資料來源建立py指令碼(sh後臺執行)

##==============================================================
## create by 2016.10.13
## weblogic自動部署指令碼 
## 實現從環境變數中獲取資料庫連線資訊和專案部署路徑 
## 新建資料來源和部署專案
##==============================================================
import os
##資料來源名稱 從docker容器環境變數中獲取連結資料
Data_Source_Name = os.environ.get("DATA_SOURCE_NAME", "DataSource")
##資料庫使用者名稱
Database_User   = os.environ.get("DB_USER_NAME", "db_develop")
##資料庫密碼
Database_Password = os.environ.get("DB_PASSWORD", "db_develop")
##資料庫ip
Database_Ip     = os.environ.get("DB_IP", "jdbc:oracle:thin:@127.0.0.1:1521:basename")
##驅動類
Database_Drive  = os.environ.get("DATA_BASE_DRIVE", "oracle.jdbc.replay.OracleDataSourceImpl")
if not(Database_Drive) :
	Database_Drive="oracle.jdbc.replay.OracleDataSourceImpl"
pod_name = os.environ.get("POD_NAME", "")
pod_namespace = os.environ.get("POD_NAMESPACE", "")

##根據環境變數判斷資料庫驅動型別,預設oracle資料庫

domain_name  = os.environ.get("DOMAIN_NAME", "base_domain")
bea_home = "/u01/oracle"
domain_path  = bea_home + '/user_projects/domains/' + domain_name

##映象容器從新啟動時,需要判斷是否需要 建立資料來源和部署應用

##判斷資料來源是否已經存在,存在處理資料來源,不存在則新建域
print '-----------離線資料來源建立開始--------------'
print '----資料來源名稱:' + Data_Source_Name + '-------------'
print '----資料庫使用者名稱:' + Database_User + '-------------'
print '----資料庫密碼:' + Database_Password + '-------------'
print '----資料庫連線:' + Database_Ip + '-------------'
print '----資料驅動:' + Database_Drive + '-------------'
print '----weblogic域目錄:' + domain_path + '-------------'
##開啟指定的域
readDomain(domain_path)
print '-----------1.開啟' + domain_name + '域'
##刪除域下的資料來源
print '----------準備刪除原資料來源-----------------'
try:
	delete(Data_Source_Name,'JDBCSystemResource')
except Exception,ex:
	print '-------------------no delete data source-----------------'
print '----------刪除原資料來源成功-------------------------------'
##在該域下將資料來源重新建一遍
cd('/')
create(Data_Source_Name, 'JDBCSystemResource')
cd('JDBCSystemResource/' + Data_Source_Name)
set('Target','AdminServer')
cd('/JDBCSystemResource/' + Data_Source_Name + '/JdbcResource/' + Data_Source_Name)
create('myJdbcDriverParams','JDBCDriverParams')
cd('JDBCDriverParams/NO_NAME_0')
set('DriverName',Database_Drive)
set('URL',Database_Ip)
set('PasswordEncrypted', Database_Password)
set('UseXADataSourceInterface', 'false')
create('myProps','Properties')
cd('Properties/NO_NAME_0')
create('user', 'Property')
cd('Property/user')
cmo.setValue(Database_User)

cd('/JDBCSystemResource/' + Data_Source_Name + '/JdbcResource/' + Data_Source_Name)
create('myJdbcDataSourceParams','JDBCDataSourceParams')
cd('JDBCDataSourceParams/NO_NAME_0')
set('JNDIName', java.lang.String(Data_Source_Name))

cd('/JDBCSystemResource/' + Data_Source_Name + '/JdbcResource/' + Data_Source_Name)
create('myJdbcConnectionPoolParams','JDBCConnectionPoolParams')
cd('JDBCConnectionPoolParams/NO_NAME_0')
set('TestTableName','DUAL')
set('TestConnectionsOnReserve',true)
print '-----------離線資料來源建立完成--------------'
## 操作日誌路徑
cd('/')
##域日誌
cmo = create('myDomainLog','Log')
cmo.setFileName('logs/'+pod_name+'_'+pod_namespace+'_base_domain.log')
##adminserver日誌
cd('/Server/AdminServer')
cmo = create('myAdminLog','Log')
cmo.setFileName('logs/'+pod_name+'_'+pod_namespace+'_AdminServer.log')
##web訪問日誌
create('myWebServer','WebServer')
cd('/Server/AdminServer/WebServer/myWebServer')
cmo = create('myWebServerLog','WebServerLog')
cmo.setFileName('logs/'+pod_name+'_'+pod_namespace+'_access.log')

##更新域
updateDomain()
##關閉域
closeDomain()
##退出wlst
exit('y',100)

3、啟動專案部署py指令碼(sh後臺執行,指令碼中延時等待判斷weblogic是否已經啟動)

##======================================================
## 恢復處於admin狀態的weblogic對外提供訪問
##======================================================
# encoding: utf-8
import os
import time
##weblogic控制檯登入名
WEBLOGIC_USER = os.environ.get("WEBLOGIC_USER", "weblogic")
##weblogic控制檯登入密碼
WEBLOGIC_PASSWORD   = os.environ.get("WEBLOGIC_PASSWORD", "weblogic123")
##web app 部署名
APP_WEB_NAME  = os.environ.get("APP_WEB_NAME", "webapp")
files = os.listdir('/u01/webapp/app/')
APP_WEB_NAME = files[0]
if not(APP_WEB_NAME):
	print '------------no any project need deploy!-----'
	exit('y',404)
print '-------------------project name:' + APP_WEB_NAME + '------------------------'
##app檔案路徑
APP_Source_Path  = os.environ.get("APP_SOURCE_PATH", "/u01/webapp/app/" + APP_WEB_NAME)
if not(APP_Source_Path):
	APP_Source_Path='/u01/webapp/app/' + APP_WEB_NAME
##需要判斷埠是否存在監聽
process="/u01/app.lock"
#將程序資訊寫入lock檔案
while true:
	time.sleep(2)
	#linux
	os.system('netstat -an|grep 8001 >/u01/app.lock')
	if not(os.path.getsize(process)):
		print "weblogic not start....."
	else:
		print "weblogic start....."
		break
##連線當前服務的域,恢復admin應用
print '----------連線當前伺服器weblogic控制檯----------'
connect(username=WEBLOGIC_USER,password=WEBLOGIC_PASSWORD,url='t3://localhost:8001',timeout=300000,adminServerName='AdminServer')
print '----------連線當前伺服器weblogic控制檯結果為:' + connected + '(true成功,false失敗)'
## 如果連線失敗嘗試再次連線
if connected == 'false' :
	connect(username=WEBLOGIC_USER,password=WEBLOGIC_PASSWORD,url='t3://localhost:8001',timeout='0',adminServerName='AdminServer')
	if connected == 'false' :
		print '---Error:連線當前伺服器weblogic控制檯失敗自動部署失敗!----------'
		# 退出指令碼
		exit('y',404)

##存在同名應用則先停止再部署
cd('/')
app=getMBean('/AppDeployments/' + APP_WEB_NAME)
if app != None :
	print '----------'+APP_WEB_NAME+'已經存在,停止該應用-------------------------------'
	stopApplication(APP_WEB_NAME)
	print '----------停止該應用成功------------------------------'
##將應用從新部署
print '----------開始部署應用-------------------------------'
print '----------APP_WEB_NAME:'+APP_WEB_NAME+'-------------------------'
print '----------APP_Source_Path:'+APP_Source_Path+'-------------------------------'
deploy(APP_WEB_NAME,APP_Source_Path,'AdminServer')
print '----------應用部署成功-------------------------------'
startApplication(APP_WEB_NAME)
##將weblogic伺服器喚,避免出現admin狀態
resume("AdminServer", block='true')
print '----------應用啟動成功-------------------------------'
##斷開連線
disconnect()
##退出wlst指令碼控制檯
exit('y',100)
4、啟動weblogic(weblogic自帶指令碼)

注意點:容器內weblogic屬於oracle使用者組,啟動後docker容器內的weblogic日誌寫到宿主機目錄時,沒有許可權,docker啟動映象時增加docker run --user=root。如果是k8s啟動的pod yaml增加:

securityContext:
          runAsUser: 0
應該表示docker容器以root使用者執行(猜的)

weblogic.WLST指令碼可以實現更多需求,需要的可以爬文件!
因為不熟悉weblogic運維和python勉強實現了需求,希望對其它人有所幫助!內容未嚴格審閱,不足處忽略。感謝前面的人,分享幫助更多人。

參考:


相關推薦

weblogic docker容器自動釋出

因工作需要,需將weblogic製作為docker映象,現將過程記錄以便查閱。 weblogic映象製作,官方從12.1.3後,提供官方指令碼用於製作映象包括weblogic靜默安裝和weblogic靜默離線建立域。https://github.com/oracle/doc

[ci]jenkins-slave-ssh docker容器-自動註入key

server serve 註入 docker容器 容器 動態 ssh key class src jenkins server 再啟動slave時候,動態的註入sshkey 只要slave有ssh+jdk即可.無需事先預置用戶名密碼給slave. 配置 inject ss

.NET Core容器容器應用部署-使用Docker-Compose

gre server rebuild asp ack 進行 add view created 1.引言 緊接上篇.NET Core容器化@Docker,這一節我們先來介紹如何使用Nginx來完成.NET Core應用的反向代理,然後再介紹多容器應用的部署問題。 2.

微服務docker容器引擎

什麼是Docker 首先docker也是一個虛擬技術 Docker 在容器的基礎上,進行了進一步的封裝,從檔案系統、網路互聯到程序隔離等等,極大的簡化了容器的建立和維護。使得 Docker 技術比虛擬機器技術更為輕便、快捷。 傳統虛擬機器技術是虛擬出一套硬體後,

springboot採用Docker容器,實現可執行jar檔案編譯成映象以及映象的釋出

作者:ydw_武漢聯絡方式:[email protected]前言:Docker是一個linux的容器管理工具,在現在的架構中,使用非常普遍,它允許使用者把容器映象推送到一個公共的庫或者是私有的映象庫中,使用也方便,對於之前專案的部署為了部署環境的統一也很麻煩,現在

.NET Core容器容器應用部署@Docker-Compose

1.引言緊接上篇.NET Core容器化@Docker,這一節我們先來介紹如何使用Nginx來完

Docker 容器技術介紹(九) Docker 安裝指定版本安裝包

開發環境為 centos 7 1 下載安裝包     在下面路徑中下載 需要的安裝包版本 (如果不能開啟,大家可以翻牆) 2 下載資料包 大家可以下載大家需要的版本,這裡下載的版本為 1.12.6 docker-engin

Docker最全教程——數據庫容器持久保存數據(十一)

sql 增加 通過 cli sel inf 遠程 支持 aaa 原文:Docker最全教程——數據庫容器化之持久保存數據(十一)上一節我們講述了SQL Server容器化實踐(註意,SQL Server現在也支持跨平臺),本節將講述如何持久保存數據,並且接下來將逐步講解其他

容器Docker小知識普及

  Docker確實是個好東西,相當於一個小型虛擬機器,裡面環境隔離只要有對應的映象就能執行業務應用、執行基礎應用、能跑資料庫等等,還能跑linux等等。     Docker 從狹義上來講就是一個程序,從廣義上來講是一個虛擬容器,其實更專業的叫法是應用容器( Applica

docker容器學習

安裝教程請下載連結:https://download.csdn.net/download/xiaozhou_zi/10591798   1、遇到問題:若下載映象長時間沒反應,更改倉庫地址 修改:/etc/docker/daemon.json增加如下內容 { "regis

Docker容器虛擬機器:拋棄傳統虛擬機器

Win10 Docker與VMware和Oracle VirtualBox衝突,使得在包含有VMware或Oracle VirtualBox的主機上不能成功安裝Win10 Docker,同理在Win10 Docker機器上也不能正常使用VMware和Oracle VirtualBox。Windo

Docker-通過docker-maven-plugin外掛實現docker映象構建並自動釋出到遠端docker伺服器

我們知道,docker能實現應用打包隔離,實現快速部署和遷移。如果我們開發應用使用了spring cloud + spring boot架構,那麼,通過docker-maven-plugin實現快速構建映象併發布到遠端docker伺服器會非常方便。相關步驟參考如下: step1、開啟docker伺服器的tc

docker容器技術虛擬化網路概述(四)

前一篇文章連結:Docker容器技術之映象管理基礎(三)   目錄 一、docker網路簡介 1、 虛擬網路通訊的三種方式 1.1、橋接網路: 什麼是MAC: 1.2、NAT網路: 1.3、Overlay Network 2、

Docker容器技術映象管理基礎(三)

上一篇文章連結:Docker容器技術基礎用法(二) 目錄   一、回顧 1.1docker容器的狀態 1.2docker容器管理時常用的命令 1.3docker的架構形式 二、About Docker Images 2.1 關於docker映象的作用

docker容器技術Dockerfile詳解(六)

上一篇文章的連線:docker容器技術之儲存卷(五) 目錄 一、前言 二、Dockerfile 2.1製作映象有兩種: 2.2 什麼是Dockerfile? 2.3 Dockerfile的語法格式 dockerfile做映象時的工作邏輯: .dockering

docker容器技術儲存卷(五)

上一篇文章連結:docker容器技術之虛擬化網路概述(四) 目錄   一、Docker底層儲存機制介紹 二、儲存卷介紹 2.1、容器內的檔案系統存在的問題 2.2、volume的好處 2.3、volume的種類 三、Docker容器使用volume

docker容器操作tomcat

1.拉取tomcat映象   docker pull tomcat       2.執行totomcat 映象 docker run -it -p 8088:8080 tomcat  (注意-p引數是指定tomcat的埠號對映8088是我們要訪問的埠號,可以隨便填寫,80

docker容器技術系統資源限制及驗正(八)

前一篇文章:docker容器技術之私有registry(七) 測試: 限制記憶體: 限制cpu:      

docker容器技術私有registry(七)

 上一篇文章:docker容器技術之Dockerfile詳解(六)  目錄 方法一:docker distribution 方法二:Harbor 方法一:docker distribution docker為了能夠

Docker 容器配置Tomcat8

docker pull tomcat #default tomcat-version:8.5.31   mkdir -p /usr/local/docker/tomcat8/conf #tomcat 配置目錄   mkdir -p /usr/local/docker/tomca