启动时将数据预加载到SQL Server docker映像中

启动时将数据预加载到SQL Server docker映像中,docker,docker-compose,dockerfile,Docker,Docker Compose,Dockerfile,我正在创建一个docker-compose.yml文件,其中包含一些不同的服务。其中一个服务是SQL Server 我的目标是启动容器,让系统自动恢复数据库的备份。我正在使用Microsoft“Wide World Importers”示例备份数据库()作为我的.bak文件 这是我的yaml: version: "3" services: sql: build: ./build/sql container_name: sql hostname: sql ne

我正在创建一个docker-compose.yml文件,其中包含一些不同的服务。其中一个服务是SQL Server

我的目标是启动容器,让系统自动恢复数据库的备份。我正在使用Microsoft“Wide World Importers”示例备份数据库()作为我的
.bak
文件

这是我的yaml:

version: "3"
services:

  sql:
    build: ./build/sql
    container_name: sql
    hostname: sql
    networks:
      - network
    ports:
      - "1433:1433"
    volumes:
      - "./data:/data"

networks:
  network:
…和我的Dockerfile:

FROM mcr.microsoft.com/mssql/server:2019-latest

ENV SA_PASSWORD [my password]
ENV ACCEPT_EULA Y
ENV MSSQL_AGENT_ENABLED true
ENV MSSQL_PID Express

EXPOSE 1433

CMD ["/data/restore.sh"]
FROM mcr.microsoft.com/mssql/server:2019-latest
CMD ["/opt/mssql/bin/sqlservr", "--accept-eula"]
最后,我的restore.sh

/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P '[my password]' -Q 'RESTORE FILELISTONLY FROM DISK = "/data/WideWorldImporters-Full.bak"' | tr -s ' ' | cut -d ' ' -f 1-2
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P '[my password]' -Q 'RESTORE DATABASE WideWorldImporters FROM DISK = "/data/WideWorldImporters-Full.bak" WITH MOVE "WWI_Primary" TO "/var/opt/mssql/data/WideWorldImporters.mdf", MOVE "WWI_UserData" TO "/var/opt/mssql/data/WideWorldImporters_userdata.ndf", MOVE "WWI_Log" TO "/var/opt/mssql/data/WideWorldImporters.ldf", MOVE "WWI_InMemory_Data_1" TO "/var/opt/mssql/data/WideWorldImporters_InMemory_Data_1"'
我可以在容器启动后使用ssh将其连接到容器中,并运行恢复脚本,最终恢复数据库。我知道这是工作的一部分。容器本身是独立工作的。还原脚本可以正常工作。把这一切放在一起是失败的

我做错了什么?我是不是走错了路?要使SQL Server容器中已有一些数据,正确的方法是什么

感谢您的帮助!谢谢大家

[编辑]。docker compose up命令的完整输出如下:

Creating network "retention_network" with the default driver
Building sql
Step 1/7 : FROM mcr.microsoft.com/mssql/server:2019-latest
2019-latest: Pulling from mssql/server
59ab41dd721a: Pull complete
57da90bec92c: Pull complete
06fe57530625: Pull complete
5a6315cba1ff: Pull complete
739f58768b3f: Pull complete
3a58fde0fc61: Pull complete
89b44069090d: Pull complete
9d86d733b28b: Pull complete
725e4eb49e7e: Pull complete
Digest: sha256:bbc6d638724b4604ab1201e89e006dcec9efdbced5ff23b680321c1bc6724c2a
Status: Downloaded newer image for mcr.microsoft.com/mssql/server:2019-latest
 ---> d273eadd9675
Step 2/7 : ENV SA_PASSWORD [My password]
 ---> Running in c5db5b3dbd46
Removing intermediate container c5db5b3dbd46
 ---> aaae9a242b75
Step 3/7 : ENV ACCEPT_EULA Y
 ---> Running in e7ca97135ff9
Removing intermediate container e7ca97135ff9
 ---> e2d5b4f405f5
Step 4/7 : ENV MSSQL_AGENT_ENABLED true
 ---> Running in f207cad20367
Removing intermediate container f207cad20367
 ---> 99774f595780
Step 5/7 : ENV MSSQL_PID Express
 ---> Running in 4e60c45eda89
Removing intermediate container 4e60c45eda89
 ---> 0137124525dc
Step 6/7 : EXPOSE 1433
 ---> Running in 92ecccf4bc31
Removing intermediate container 92ecccf4bc31
 ---> 79e4778f8b02
Step 7/7 : CMD ["/data/restore.sh"]
 ---> Running in c9278fbd3b6b
Removing intermediate container c9278fbd3b6b
 ---> 287f7f95793a
Successfully built 287f7f95793a
Successfully tagged retention_sql:latest
WARNING: Image for service sql was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating sql ... done
Attaching to sql
sql    | SQL Server 2019 will run as non-root by default.
sql    | This container is running as user mssql.
sql    | To learn more visit https://go.microsoft.com/fwlink/?linkid=2099216.
sql    | Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : Login timeout expired.
sql    | Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : TCP Provider: Error code 0x2749.
sql    | Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online..
sql    | Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : Login timeout expired.
sql    | Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : TCP Provider: Error code 0x2749.
sql    | Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online..
sql exited with code 1

我认为问题在于,按照当前编写的方式,
restore.sh
脚本正在成功完成,然后容器终止(这就是应该发生的情况)。Docker容器只有在该命令继续运行时才有效。我会这样重新安排:

RUN /data/restore.sh
[CMD "<DB command>"]
这对我很管用


或者,您可以将
restore.sh
保留为
CMD
,但随后在脚本末尾添加
/opt/mssql/bin/sqlservr--accept eula
。这将在还原完成后启动数据库,并阻止容器退出。

我认为问题在于,按照当前编写的方式,
restore.sh
脚本正在成功完成,然后容器终止(这就是应该发生的情况)。Docker容器只有在该命令继续运行时才有效。我会这样重新安排:

RUN /data/restore.sh
[CMD "<DB command>"]
这对我很管用


或者,您可以将
restore.sh
保留为
CMD
,但随后在脚本末尾添加
/opt/mssql/bin/sqlservr--accept eula
。这将在还原完成后启动数据库,并阻止容器退出。

当您将所有内容放在一起时,容器是否仍在运行或停止?它停止。我将发布完整的输出。我不太熟悉在Docker中运行windows,但是:您是否正在运行
还原
,并且成功完成并终止?因为这是容器中开始的
CMD
,当它终止时,容器应该停止。在
restore.sh
完成后,是什么使容器保持活动状态?@DavidByers如果停止,则表示容器运行了所有内容,并且没有挂起的前台线程。因此,如果数据库是在后台启动的,那就是您的问题。从前景开始,我不太确定。。。请注意,这不是Docker中的Windows。它在Ubuntu上运行。这也是我与docker compose的第一个“让我的脚湿”项目,所以我不能100%确定我的方法是否正确。最终的目标是在Docker中启动SQL Server并预加载数据。我看到的很多解决方案都使用docker运行命令,并且没有很好地封装在docker compose文件中,但这必须是可能的,而且“应该”很简单,对吧?当你把所有这些放在一起时,容器是仍然在运行还是停止了?它停止了。我将发布完整的输出。我不太熟悉在Docker中运行windows,但是:您是否正在运行
还原
,并且成功完成并终止?因为这是容器中开始的
CMD
,当它终止时,容器应该停止。在
restore.sh
完成后,是什么使容器保持活动状态?@DavidByers如果停止,则表示容器运行了所有内容,并且没有挂起的前台线程。因此,如果数据库是在后台启动的,那就是您的问题。从前景开始,我不太确定。。。请注意,这不是Docker中的Windows。它在Ubuntu上运行。这也是我与docker compose的第一个“让我的脚湿”项目,所以我不能100%确定我的方法是否正确。最终的目标是在Docker中启动SQL Server并预加载数据。我看到的很多解决方案都使用docker运行命令,并没有很好地封装在docker compose文件中,但这必须是可能的,而且“应该”很简单,对吗?