【问题标题】:Entrypoint script is not running from docker-compose file入口点脚本未从 docker-compose 文件运行
【发布时间】:2021-11-14 13:15:37
【问题描述】:

我的目标是在运行其他图像之前为我的应用创建一个 SQL 登录。由于我的容器使用 Linux - 脚本以 LF 行结尾保存。并且 Docker 输出控制台没有显示任何与脚本相关的错误,仅显示我的应用程序 - 它们无法连接到服务器,因为不存在此类登录。

问题是 shell 脚本没有运行并且没有创建登录。提前感谢您的帮助。

我在网上寻找示例,这是我想出的:

docker-compose.yml

version: '3.4'

services:
    mssql:
        image: mcr.microsoft.com/mssql/server:2019-latest
        environment:
            SA_PASSWORD: "3qqimIuTQEGqVCD!"
            ACCEPT_EULA: "Y"
            LOGIN: "MyLogin"
            PASSWORD: "3qqimIuTQEGqVCD!"

        ports:
            - "1433:1433"
        volumes:
            - ./DockerScripts/SQL/CreateLogin.sql:/CreateLogin.sql
            - ./DockerScripts/Shell/Entrypoint.sh:/Entrypoint.sh
        entrypoint:
            - ./Entrypoint.sh

    webapi:
        image: ${DOCKER_REGISTRY-}webapi
        build:
            context: .
            dockerfile: Source/Code/Web/WebApi/Dockerfile
        depends_on:
            - mssql

    maintenance:
        image: ${DOCKER_REGISTRY-}maintenance
        build:
            context: .
            dockerfile: Source/Code/Web/Maintenance/Dockerfile
        depends_on:
            - mssql

DockerScripts\Shell\Entrypoint.sh

#!/bin/bash

# Start SQL server
/opt/mssql/bin/sqlservr

# Wait for MSSQL server to start
export STATUS=1
i=0
while [[ $STATUS -ne 0 ]] && [[ $i -lt 30 ]]; do
    i=$i+1
    /opt/mssql-tools/bin/sqlcmd -t 1 -U sa -P $SA_PASSWORD -Q "select 1" >> /dev/null
    STATUS=$?
done

if [ $STATUS -ne 0 ]; then
    echo "Error: MS SQL Server took more than 30 seconds to start up."
    exit 1
fi

echo "MS SQL Server started successfully."

echo "Setting up server login."

/opt/mssql-tools/bin/sqlcmd  -U sa -P $SA_PASSWORD -S localhost -i CreateLogin.sql

DockerScripts\SQL\CreateLogin.sql

USE [master];
GO
CREATE LOGIN [$(LOGIN)] WITH PASSWORD=N'$(PASSWORD)', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF;
GO
ALTER SERVER ROLE [dbcreator] ADD MEMBER [$(LOGIN)];
GO

更新

我删除了很多内容,因为它与问题无关。 所以现在,主要问题仍然存在 - Entrypoint.sh 只是在撰写启动时没有被调用。

【问题讨论】:

  • 可以在while循环中添加一个sleep 1等待sql server启动
  • @PtitXav 这并没有解决我的问题,但还是谢谢你,我忘了把sleep放在那里。
  • 可能在里面执行一次并尝试手动使用 sqlcmd 来查看问题所在。
  • @TheFool,对不起,没有真正明白你的意思。我理解你的想法,但不明白你想让我怎么做。请您详细解释一下好吗?
  • 很难确切地说,因为您在 imo 上发布了太多的 sutff。它不是很专注。但我建议您使用 bash 或 sh 作为命令并提供 -ti 标志在正在运行的容器上使用 exec。或者你在服务上使用 docker-compose run 来做同样的事情。进入后,您可以使用 sqlcmd 开始调试。

标签: sql shell asp.net-core docker-compose sqlcmd


【解决方案1】:

好的,所以我终于能够解决这个问题了。

问题不是没有调用Entrypoint.sh,而是后面的所有命令

# Start SQL server
/opt/mssql/bin/sqlservr

只是被跳过了。

我真的不知道为什么,但是我在网上搜索得越来越多,最后我想出了这个解决方案。

首先,我将登录创建逻辑分离到自己的脚本文件中,这稍微提高了可读性:

DockerScripts/Shell/CreateLogin.sh

#!bin/bash

echo "Creating MS SQL Login."

for i in {1..50};
do

/opt/mssql-tools/bin/sqlcmd -U sa -P $SA_PASSWORD -S localhost -i CreateLogin.sql

    if [ $? -eq 0 ]
    then
        echo "MS SQL Login created."
        break
    else
        echo "..."
        sleep 1
    fi

done

其次 - 我将 Entrypoint.sh 文件简化为几行:

#!bin/bash
/opt/mssql/bin/sqlservr | /opt/mssql/bin/permissions_check.sh | /Scripts/CreateLogin.sh

让我解释一下上面的命令是什么意思:

  • /opt/mssql/bin/sqlservr - 这会启动服务器本身。
  • /opt/mssql/bin/permissions_check.sh - 这只是默认设置 entrypint 文件。
  • /Scripts/CreateLogin.sh - 这指向我们 服务器登录创建。

当然,我将新的 shell 脚本安装到一个卷上。

就是这样,在这个问题上挣扎了几个月,结果发现它很容易解决。

希望这对其他人有所帮助。谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多