AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 276880
Accepted
buddinggeek
buddinggeek
Asked: 2020-10-12 19:00:13 +0800 CST2020-10-12 19:00:13 +0800 CST 2020-10-12 19:00:13 +0800 CST

在没有 Internet 的 Windows 服务器上构建自定义 SQL Server 2017/2019 容器

  • 772

我有点进退两难

我得到了一个运行在 Windows Server 2016 上的虚拟机,并安装了 Docker Enterprise。我的管理层希望在此 VM 中运行的 Windows 容器上使用带有 docker 的 SQL Server 2019。这是一个POC项目。VM 没有任何 Internet 连接,因此我无法从 docker hub 中提取基本映像。我知道有可用的 SQL Server 2017 开发人员版本。可以做些什么来确保我可以在这种情况下继续使用容器?特别是当虚拟机没有任何互联网连接时?

我尝试在运行 Windows 10Pro 的本地计算机上下载 SQL Server 2017 Developer 版本,然后将容器映像移动到 VM 上。但是当我尝试加载容器时,我收到一条错误消息,提示“主机操作系统不匹配”。那是当我找到下面的网站时

https://learn.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/version-compatibility?tabs=windows-server-2004%2Cwindows-10-2004

请建议我如何在这种情况下创建图像

sql-server sql-server-2017
  • 1 1 个回答
  • 313 Views

1 个回答

  • Voted
  1. Best Answer
    Dan Guzman
    2020-10-13T04:18:59+08:002020-10-13T04:18:59+08:00

    在撰写本文时,SQL Server 2019 Windows 容器仍处于预览阶段。如果您未加入 Early Adopter 计划,则可以从 Windows Server Core 基础映像开始创建自定义映像,然后安装 SQL Server 2019(以及可选的 CU)以创建自定义映像。

    构建最容易在具有 Internet 连接的机器上完成,以从公共复制中提取基本 OS 映像。然后,您可以在没有 Internet 连接的情况下将图像复制到计算机(或将其推送到本地私有复制器)并从那里运行它。或者,拉取、保存和加载操作系统映像(步骤 6-8)并在服务器上运行构建。

    以下是执行此操作的一般步骤的示例。我对格式的道歉。我受到挑战。

    1. 在您的 Windows 机器上创建一个空目录(例如 C:\dockerfiles)

       MKDIR C:\dockerfiles
      
    2. 在该目录中创建一个包含以下内容的 dockerfile

       #Start with a Windows Server Core base image.
       #Note that the image with tag 'latest' is pulled by default, which could be older than the actual host OS version.
       #In this case, specify the version-specific to pull a later image compatible with the host OS version.
      
       FROM mcr.microsoft.com/windows/servercore:2004
      
       #Parameters for start.ps1:
       ENV sa_password="_" \
           attach_dbs="[]" \
           ACCEPT_EULA="_" \
           sa_password_path="C:\ProgramData\Docker\secrets\sa-password"
      
       #set default shell to PowerShell and set preferences:
       SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
      
       #set current directory to root (C:\)
       WORKDIR /
      
       #copy SQL Server setup folder into build image for installation
       COPY setup setup
      
       #run setup to install
       RUN  \setup\setup.exe /q /ACTION=Install /INSTANCENAME=MSSQLSERVER /FEATURES=SQLEngine /UPDATEENABLED=0 /SQLSVCACCOUNT='NT AUTHORITY\System' /SQLSYSADMINACCOUNTS='BUILTIN\ADMINISTRATORS' /TCPENABLED=1 /NPENABLED=0 /IACCEPTSQLSERVERLICENSETERMS
      
       #remove setup files
       RUN  Remove-Item -Force -Recurse -Path 'setup'
      
       #create empty directory (C:\SqlFiles) for user database files
       RUN "mkdir SqlFiles | Out-Null"
      
       #stop SQL Server service, configure TCP/IP, allow SQL authentication, and set default file locations
       RUN stop-service MSSQLSERVER ; \
               set-itemproperty -path 'HKLM:\software\microsoft\microsoft sql server\mssql15.MSSQLSERVER\mssqlserver\supersocketnetlib\tcp\ipall' -name tcpdynamicports -value '' ; \
               set-itemproperty -path 'HKLM:\software\microsoft\microsoft sql server\mssql15.MSSQLSERVER\mssqlserver\supersocketnetlib\tcp\ipall' -name tcpport -value 1433 ; \
               set-itemproperty -path 'HKLM:\software\microsoft\microsoft sql server\mssql15.MSSQLSERVER\mssqlserver\' -name LoginMode -value 2 ; \
               set-itemproperty -path 'HKLM:\software\microsoft\microsoft sql server\mssql15.MSSQLSERVER\mssqlserver\' -name BackupDirectory -value 'C:\SqlFiles' ; \
               set-itemproperty -path 'HKLM:\software\microsoft\microsoft sql server\mssql15.MSSQLSERVER\mssqlserver\' -name DefaultData -value 'C:\SqlFiles' ; \
               set-itemproperty -path 'HKLM:\software\microsoft\microsoft sql server\mssql15.MSSQLSERVER\mssqlserver\' -name DefaultLog -value 'C:\SqlFiles' ;
      
       #set command used for container health check status
       HEALTHCHECK CMD [ "sqlcmd", "-Q", "SELECT 1;" ]
      
       #copy startup script to image
       COPY start.ps1 /
      
       #specify command invoked when container is run from this image
       CMD .\start -sa_password $env:sa_password -ACCEPT_EULA $env:ACCEPT_EULA -attach_dbs \"$env:attach_dbs\" -Verbose
      
    3. 在构建目录中创建 start.ps1 文件(例如 C:\dockerfiles\start.ps1)。下面是一个类似于我使用的示例脚本。

       # The script sets the sa password and start the SQL Service
       # Also it attaches additional database from the disk
       # The format for attach_dbs
      
       param(
       [Parameter(Mandatory=$false)]
       [string]$sa_password,
      
       [Parameter(Mandatory=$false)]
       [string]$ACCEPT_EULA,
      
       [Parameter(Mandatory=$false)]
       [string]$attach_dbs
       )
      
      
       if($ACCEPT_EULA -ne "Y")
       {
           Write-Verbose "ERROR: You must accept the End User License Agreement before this container can start."
           Write-Verbose "Set the environment variable ACCEPT_EULA to 'Y' if you accept the agreement."
      
           exit 1
       }
      
       #start the service
       Write-Verbose "Starting SQL Server"
       Start-Service MSSQLSERVER
      
       if($sa_password -eq "_") {
           if (Test-Path $env:sa_password_path) {
               $sa_password = Get-Content -Raw $secretPath
           }
           else {
               Write-Verbose "WARN: Using default SA password, secret file not found at: $secretPath"
           }
       }
      
       if($sa_password -ne "_")
       {
           Write-Verbose "Changing SA login credentials"
           $sqlcmd = "ALTER LOGIN sa with password=" +"'" + $sa_password + "'" + ";ALTER LOGIN sa ENABLE;"
           & sqlcmd -Q $sqlcmd
       }
      
       $attach_dbs_cleaned = $attach_dbs.TrimStart('\\').TrimEnd('\\')
      
       $dbs = $attach_dbs_cleaned | ConvertFrom-Json
      
       if ($null -ne $dbs -And $dbs.Length -gt 0)
       {
           Write-Verbose "Attaching $($dbs.Length) database(s)"
      
           Foreach($db in $dbs) 
           {            
               $files = @();
               Foreach($file in $db.dbFiles)
               {
                   $files += "(FILENAME = N'$($file)')";           
               }
      
               $files = $files -join ","
               $sqlcmd = "IF EXISTS (SELECT 1 FROM SYS.DATABASES WHERE NAME = '" + $($db.dbName) + "') BEGIN EXEC sp_detach_db [$($db.dbName)] END;CREATE DATABASE [$($db.dbName)] ON $($files) FOR ATTACH;"
      
               Write-Verbose "Invoke-Sqlcmd -Query $($sqlcmd)"
               & sqlcmd -Q $sqlcmd
           }
       }
      
       Write-Verbose "Started SQL Server."
      
       Write-Verbose "Changing SQL Server server name to $($env:COMPUTERNAME)"
       $sqlcmd = "EXEC sp_dropserver @@SERVERNAME;EXEC sp_addserver N'$env:COMPUTERNAME', 'local';"
       & sqlcmd -Q $sqlcmd
      
       Write-Verbose "Restarting SQL Server."
       Stop-Service MSSQLSERVER
       Start-Service MSSQLSERVER
       Write-Verbose "Restarted SQL Server."
      
       Write-Verbose "Tailing log..."
       Get-Content -Path "C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Log\ERRORLOG" -Wait
      
    4. 将文件从 SQL 2019 安装媒体复制到安装子目录(例如 C:\dockerfiles\setup)

    5. 在构建目录(例如 C:\dockerfiles)的竞赛中运行 docker build 来构建和标记自定义镜像

       docker build -t mssql-2019-windows-dev-rtm-example .
      
    6. 将图像保存到 tar 文件

       docker save --output "C:\temp\mssql-2019-windows-dev-rtm-example.tar" mssql-2019-windows-dev-rtm-example
      
    7. 将图像复制到 Windows 服务器

       copy "C:\temp\mssql-2019-windows-dev-rtm-example.tar" "\\YourServer\c$\temp\mssql-2019-windows-dev-rtm-example.tar"
      
    8. 从 Windows 服务器机器上的 tar 文件加载图像:

       docker load --input "C:\temp\mssql-2019-windows-dev-rtm-example.tar"
      
    9. 运行图像的示例

       docker run -d -p 14331:1433 -h sql2019 --name sql2019 -e "sa_password=y0ourS@pAssword" -e "ACCEPT_EULA=Y" -e attach_dbs="" --rm mssql-2019-windows-dev-rtm-example:latest
      

    请注意,生产中尚不支持 Windows 容器,除非您加入 EA 预览版,否则您目前只能使用 SQL 2019 映像。

    • 1

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve