入口点脚本不是 运行 来自 docker-compose 文件
Entrypoint script is not running from docker-compose file
我的目标是在 运行 其他图像之前为我的应用程序创建一个 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
只是在 compose 启动时没有被调用。
好的,我终于解决了这个问题。
问题不是没有调用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
- 这只是默认值
入口点文件。
/Scripts/CreateLogin.sh
- 这将我们指向
服务器登录创建。
当然,我将新的 shell 脚本安装到卷中。
就是这样,几个月来一直在努力解决这个问题,结果证明它很容易解决。
希望这会对其他人有所帮助。谢谢!
我的目标是在 运行 其他图像之前为我的应用程序创建一个 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
只是在 compose 启动时没有被调用。
好的,我终于解决了这个问题。
问题不是没有调用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
- 这只是默认值 入口点文件。/Scripts/CreateLogin.sh
- 这将我们指向 服务器登录创建。
当然,我将新的 shell 脚本安装到卷中。
就是这样,几个月来一直在努力解决这个问题,结果证明它很容易解决。
希望这会对其他人有所帮助。谢谢!