如何在 Docker SQL Server 映像上运行安装脚本?

Joh*_*eer 6 sql-server docker

我正在尝试在 Docker SQL Server 映像上运行安装脚本

为此,我从 mssql 映像创建了一个 Dockerfile

FROM microsoft/mssql-server-linux:2017-CU8

# Create directory to place app specific files
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

# Copy setup scripts
COPY  entrypoint.sh \
    ./

RUN chmod +x ./entrypoint.sh

CMD /bin/bash ./entrypoint.sh
Run Code Online (Sandbox Code Playgroud)

entrypoint.sh我启动 SQL Server 时,我想运行一些安装命令。

#!/bin/bash

#start SQL Server
/opt/mssql/bin/sqlservr &

echo 'Sleeping 20 seconds before running setup script'
sleep 20s

echo 'Starting setup script'

#run the setup script to create the DB and the schema in the DB
/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P <MyPassWd> -d master -i setup.sql

echo 'Finished setup script'
Run Code Online (Sandbox Code Playgroud)

当我运行这个脚本时,数据库启动,安装运行,安装完成后,容器关闭。

所以我认为脚本中的某些内容会使容器关闭,因此我将脚本精简到最低限度

#!/bin/bash

#start SQL Server
/opt/mssql/bin/sqlservr &

echo 'Sleeping 20 seconds before running setup script'
sleep 20s
Run Code Online (Sandbox Code Playgroud)

这也会在之后停止容器 sleep 20s完成。

继续...

#!/bin/bash

#start SQL Server
/opt/mssql/bin/sqlservr &
Run Code Online (Sandbox Code Playgroud)

立即停止容器

进而...

#!/bin/bash

#start SQL Server
/opt/mssql/bin/sqlservr
Run Code Online (Sandbox Code Playgroud)

现在容器运行了,但是我不能做任何初始化

有人知道如何让这个工作吗?

小智 9

把sql server的密码改得够复杂。

docker run -d -p 1433:1433 -e "sa_password=ComplexPW2019!" -e "ACCEPT_EULA=Y" <sqlserverimageid>
Run Code Online (Sandbox Code Playgroud)


小智 2

此问题的根本原因是 docker 容器的 PID 1 分配。

PID 1 将分配给 Dockerfile 中 CMD 给出的命令(在我们的例子中为 ./entrypoint.sh)

根据 PID 1,容器有生命垃圾邮件(一旦 PID 1 停止/被杀死的容器将被停止)

1) 如果是 /opt/mssql/bin/sqlservr ,
子进程 ID 将分配给 sqlserver cmd 并在后台执行,一旦执行了脚本的其余部分,容器将停止。

2) 如果是 /opt/mssql/bin/sqlservr
脚本将不会从此处继续执行,直到执行完成。

因此解决方案是将 PID 1 分配给 CMD /opt/mssql/bin/sqlservr 并且脚本的其余部分应作为子进程执行。

我做了以下更改,它对我有用。

在 Dockerfile 中

replace CMD /bin/bash ./entrypoint.sh to CMD exec /bin/bash entrypoint.sh

在入口点.sh

   #!/bin/bash
   #start SQL Server
   sh -c " 
   echo 'Sleeping 20 seconds before running setup script'
   sleep 20s

   echo 'Starting setup script'

   #run the setup script to create the DB and the schema in the DB
   /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P \"YourStrong!Passw0rd\" -Q 
   \"ALTER LOGIN SA WITH PASSWORD='NewStrong!Passw0rd'\"

    echo 'Finished setup script'
    exit
    " & 
    exec /opt/mssql/bin/sqlservr
Run Code Online (Sandbox Code Playgroud)