全部产品
云市场

打包Linux下sqlserver初始化镜像

更新时间:2019-04-19 00:12:13

本文档针对SQL Server镜像有效,RDS版本暂不支持。

1、准备数据库初始化sql脚本

当部署应用实例后,用于建表或插入基础数据等数据库初始化工作。

  1. /******************************************/
  2. /* 创建user数据表,并插入两条初始化数据 */
  3. /******************************************/
  4. CREATE DATABASE demoDB
  5. GO
  6. CREATE TABLE [demoDB].[dbo].[user]
  7. (
  8. [id] bigint NOT NULL ,
  9. [gmt_create] datetime NOT NULL ,
  10. [gmt_modified] datetime NOT NULL ,
  11. [name] nvarchar(50) NOT NULL ,
  12. [phone] nvarchar(50) NOT NULL
  13. )
  14. ON [PRIMARY]
  15. GO
  16. ALTER TABLE [demoDB].[dbo].[user] ADD CONSTRAINT [PK_user] PRIMARY KEY CLUSTERED
  17. (
  18. [id]
  19. )
  20. WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
  21. GO
  22. 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');
  23. 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');
  24. GO

注意:
1、如果使用现有库导出的sql文件,请务必确保添加了创建数据库的相关语句。
2、导出的sql文件请不要携带本地系统的数据库文件的配置信息。
3、字符串属性字段请使用nvarchar,防止中文字符出现乱码,同时在脚本中插入中文字段时,需要在中文字段前添加N标示,如示例中所示。

2、准备容器初始化命令脚本

创建用于容器初始化的命令脚本,例如取名为init.sh,在脚本中添加sqlcmd调用db.sql的脚本指令,以及启动自有应用的指令(本文档用iot-demo.jar应用作为示例):

  1. #!/bin/bash --login
  2. function prop() {
  3. env|grep "${1}"|cut -d'=' -f2
  4. }
  5. #从容器中的环境变量获取SQLServer访问参数
  6. USER=$(prop 'iot\.hosting\.{这里填写服务名称}\.mssqlUser')
  7. PASSWORD=$(prop 'iot\.hosting\.{这里填写服务名称}\.mssqlPassword')
  8. HOSTNAME_FULL=$(prop 'iot\.hosting\.{这里填写服务名称}\.mssqlUrl')
  9. HOSTNAME_TEMP=${HOSTNAME_FULL#jdbc:sqlserver://}
  10. HOSTNAME=${HOSTNAME_TEMP%:*}",1433"
  11. #使用数据库初始化sql文件初始化数据库
  12. /opt/mssql-tools/bin/sqlcmd -S ${HOSTNAME} -U ${USER} -P ${PASSWORD} -i db.sql -o db_execution.log
  13. #启动运行自有应用
  14. java -jar -Xms512m -Xmx512m /iot-demo.jar --server.port=8080

注意:
1、在脚本头部需要使用#!/bin/bash --login注明脚本加载模式,确保容器内的环境变量可以被应用正常获取。
2、启动jar应用时建议加上内存限制,防止内存使用超过容器限制而无法正常启动。
3、脚本中SQL Server数据库连接信息,是通过环境变量来获取的,需要与数据库部署节点的设置保持一致。
sqlserver.png

3、准备Dockerfile文件

编写Dockerfile文件,将编写好的sh文件和sql文件拷贝到容器指定目录,并配置相应的执行权限。在这里需要配置sqlcmd(用于提供shell脚本访问SQL Server数据库的能力)的安装指令,例如:

  1. FROM ubuntu:16.04
  2. # 安装jdk8
  3. RUN apt-get update && apt-get install -y openjdk-8-jdk
  4. # 安装sqlcmd环境
  5. RUN apt-get update && apt-get install -y \
  6. curl apt-transport-https debconf-utils \
  7. && rm -rf /var/lib/apt/lists/*
  8. RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
  9. RUN curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list > /etc/apt/sources.list.d/mssql-release.list
  10. RUN apt-get update && ACCEPT_EULA=Y apt-get install -y msodbcsql mssql-tools
  11. RUN echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
  12. RUN /bin/bash -c "source ~/.bashrc"
  13. # 安装中文显示环境,在终端操作时,确保能正确的显示中文内容
  14. RUN apt-get update && apt-get install -y locales
  15. ENV LANG C.UTF-8
  16. # 因sqlcmd限制,需要配置终端环境使用en_US.UTF-8
  17. RUN echo "en_US.UTF-8 UTF-8" > /etc/locale.gen && locale-gen
  18. # 复制自有应用
  19. COPY iot-demo-0.0.1-SNAPSHOT.jar /iot-demo.jar
  20. # 复制数据库初始化文件和启动脚本
  21. COPY db.sql /db.sql
  22. COPY init.sh /init.sh
  23. RUN chmod +x /init.sh
  24. EXPOSE 8080
  25. ENTRYPOINT ["/bin/bash","-c","/init.sh"]

注意:当前sqlcmd必须使用ubuntu:16.04作为基础镜像来源才能被正确安装。

4、打包镜像

最后使用docker build指令进行镜像构建,完成后推送到应用托管镜像仓库即可进行配置部署。