You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Docker容器启动时运行自定义命令且不覆盖原镜像命令

SQL Server Docker容器启动时运行自定义命令的可用方案

以下方案均不会覆盖官方镜像原有SQL Server启动逻辑,可满足初始化建库、执行迁移、注入种子数据等需求:

  • 自定义镜像封装入口点脚本
    编写自定义入口脚本,先执行你的初始化逻辑,最后启动官方默认的SQL Server进程作为容器主进程即可,不需要修改command配置。

    1. 本地新建entrypoint.sh脚本:
    #!/bin/bash
    # 等待SQL Server服务就绪
    until /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "$SA_PASSWORD" -Q "SELECT 1" > /dev/null 2>&1
    do
      sleep 2
    done
    # 执行自定义初始化逻辑,比如建库、跑迁移脚本
    /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "$SA_PASSWORD" -i /init.sql
    # 启动官方默认SQL Server进程,接管PID 1
    exec /opt/mssql/bin/sqlservr
    
    1. 编写用于构建自定义镜像的Dockerfile:
    FROM mcr.microsoft.com/mssql/server:latest
    COPY entrypoint.sh /entrypoint.sh
    COPY init.sql /init.sql
    RUN chmod +x /entrypoint.sh
    ENTRYPOINT ["/entrypoint.sh"]
    
    1. 在docker-compose.yml中直接使用这个自定义镜像即可,无需额外配置command。
  • Sidecar初始化容器方案
    不需要修改官方SQL Server镜像,单独新增一个初始化服务,依赖数据库服务,初始化完成后自动退出,适合开发、生产多场景使用。
    参考docker-compose.yml配置:

    services:
      db:
        image: mcr.microsoft.com/mssql/server:latest
        environment:
          SA_PASSWORD: "YourStrong!Passw0rd"
          ACCEPT_EULA: "Y"
        ports:
          - "1433:1433"
      db-init:
        image: mcr.microsoft.com/mssql-tools:latest
        depends_on:
          - db
        volumes:
          - ./init.sql:/scripts/init.sql
        command: >
          bash -c "
          until /opt/mssql-tools/bin/sqlcmd -S db -U SA -P 'YourStrong!Passw0rd' -Q 'SELECT 1' > /dev/null 2>&1; do
            sleep 2
          done
          /opt/mssql-tools/bin/sqlcmd -S db -U SA -P 'YourStrong!Passw0rd' -i /scripts/init.sql
          "
    

    如果是ASP.NET Core项目,也可以直接把初始化服务的镜像换成项目运行时镜像,直接执行dotnet ef database update命令完成迁移和种子数据注入。

  • 本地挂载脚本免构建方案
    开发阶段不想单独构建自定义镜像的话,可以直接把入口脚本和初始化SQL通过挂载的方式注入容器,直接在docker-compose.yml中指定入口点即可。
    参考配置:

    services:
      db:
        image: mcr.microsoft.com/mssql/server:latest
        environment:
          SA_PASSWORD: "YourStrong!Passw0rd"
          ACCEPT_EULA: "Y"
        ports:
          - "1433:1433"
        volumes:
          - ./entrypoint.sh:/entrypoint.sh
          - ./init.sql:/init.sql
        entrypoint: ["/bin/bash", "-c", "chmod +x /entrypoint.sh && /entrypoint.sh"]
    

注意事项

  • 自定义入口点脚本执行完所有初始化逻辑后,必须用exec启动/opt/mssql/bin/sqlservr作为主进程,否则容器会在初始化完成后直接退出。
  • 执行SQL操作前必须添加等待逻辑,确认SQL Server服务完全启动后再执行初始化命令,避免连接报错。

内容的提问来源于stack exchange,提问作者Hossein Fallah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 05:45:03