打包Linux下sqlserver初始化鏡像
本文檔針對SQL Server鏡像有效,RDS版本暫不支持。
1、準備數(shù)據(jù)庫初始化sql腳本
當部署應用實例后,用于建表或插入基礎數(shù)據(jù)等數(shù)據(jù)庫初始化工作。
/******************************************/
/* 創(chuàng)建user數(shù)據(jù)表,并插入兩條初始化數(shù)據(jù) */
/******************************************/
CREATE DATABASE demoDB
GO
CREATE TABLE [demoDB].[dbo].[user]
(
[id] bigint NOT NULL ,
[gmt_create] datetime NOT NULL ,
[gmt_modified] datetime NOT NULL ,
[name] nvarchar(50) NOT NULL ,
[phone] nvarchar(50) NOT NULL
)
ON [PRIMARY]
GO
ALTER TABLE [demoDB].[dbo].[user] ADD CONSTRAINT [PK_user] PRIMARY KEY CLUSTERED
(
[id]
)
WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
GO
INSERT INTO [demoDB].[dbo].[user] (id, gmt_create, gmt_modified, name, phone) VALUES ('1', '2018-11-26 10:00:00', '2018-11-26 10:00:00', N'測試', N'1388888888');
INSERT INTO [demoDB].[dbo].[user] (id, gmt_create, gmt_modified, name, phone) VALUES ('2', '2018-11-26 10:00:00', '2018-11-26 10:00:00', N'test', N'1366666666');
GO
注意:
如果使用現(xiàn)有庫導出的sql文件,請務必確保添加了創(chuàng)建數(shù)據(jù)庫的相關語句。
導出的sql文件請不要攜帶本地系統(tǒng)的數(shù)據(jù)庫文件的配置信息。
字符串屬性字段請使用nvarchar,防止中文字符出現(xiàn)亂碼,同時在腳本中插入中文字段時,需要在中文字段前添加N標識,如示例中所示。
2、準備容器初始化命令腳本
創(chuàng)建用于容器初始化的命令腳本,例如取名為init.sh,在腳本中添加sqlcmd調(diào)用db.sql的腳本指令,以及啟動自有應用的指令(本文檔用iot-demo.jar應用作為示例):
#!/bin/bash --login
function prop() {
env|grep "${1}"|cut -d'=' -f2
}
#從容器中的環(huán)境變量獲取SQLServer訪問參數(shù)
USER=$(prop 'iot\.hosting\.{這里填寫服務名稱}\.mssqlUser')
PASSWORD=$(prop 'iot\.hosting\.{這里填寫服務名稱}\.mssqlPassword')
HOSTNAME_FULL=$(prop 'iot\.hosting\.{這里填寫服務名稱}\.mssqlUrl')
HOSTNAME_TEMP=${HOSTNAME_FULL#jdbc:sqlserver://}
HOSTNAME=${HOSTNAME_TEMP%:*}",1433"
#使用數(shù)據(jù)庫初始化sql文件初始化數(shù)據(jù)庫
/opt/mssql-tools/bin/sqlcmd -S ${HOSTNAME} -U ${USER} -P ${PASSWORD} -i db.sql -o db_execution.log
#啟動運行自有應用
java -jar -Xms512m -Xmx512m /iot-demo.jar --server.port=8080
注意:
在腳本頭部需要使用
#!/bin/bash --login
注明腳本加載模式,確保容器內(nèi)的環(huán)境變量可以被應用正常獲取。啟動jar應用時建議加上內(nèi)存限制,防止內(nèi)存使用超過容器限制而無法正常啟動。
腳本中SQL Server數(shù)據(jù)庫連接信息,是通過環(huán)境變量來獲取的,需要與數(shù)據(jù)庫部署節(jié)點的設置保持一致。
3、準備Dockerfile文件
編寫Dockerfile文件,將編寫好的sh文件和sql文件拷貝到容器指定目錄,并配置相應的執(zhí)行權(quán)限。在這里需要配置sqlcmd(用于提供Shell腳本訪問SQL Server數(shù)據(jù)庫的能力)的安裝指令,例如:
FROM ubuntu:16.04
# 安裝jdk8
RUN apt-get update && apt-get install -y openjdk-8-jdk
# 安裝sqlcmd環(huán)境
RUN apt-get update && apt-get install -y \
curl apt-transport-https debconf-utils \
&& rm -rf /var/lib/apt/lists/*
RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
RUN curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list > /etc/apt/sources.list.d/mssql-release.list
RUN apt-get update && ACCEPT_EULA=Y apt-get install -y msodbcsql mssql-tools
RUN echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
RUN /bin/bash -c "source ~/.bashrc"
# 安裝中文顯示環(huán)境,在終端操作時,確保能正確的顯示中文內(nèi)容
RUN apt-get update && apt-get install -y locales
ENV LANG C.UTF-8
# 因sqlcmd限制,需要配置終端環(huán)境使用en_US.UTF-8
RUN echo "en_US.UTF-8 UTF-8" > /etc/locale.gen && locale-gen
# 復制自有應用
COPY iot-demo-0.0.1-SNAPSHOT.jar /iot-demo.jar
# 復制數(shù)據(jù)庫初始化文件和啟動腳本
COPY db.sql /db.sql
COPY init.sh /init.sh
RUN chmod +x /init.sh
EXPOSE 8080
ENTRYPOINT ["/bin/bash","-c","/init.sh"]
注意:當前sqlcmd必須使用ubuntu:16.04
作為基礎鏡像來源才能被正確安裝。
4、打包鏡像
最后使用docker build
指令進行鏡像構(gòu)建,完成后推送到應用托管鏡像倉庫即可進行配置部署。