【问题标题】:Run command after docker container is starteddocker容器启动后运行命令
【发布时间】:2018-01-19 13:38:14
【问题描述】:

我已经准备了一个 docker-compose 文件来部署带有数据库的容器:

services:
  tmp-db:
    image: microsoft/mssql-server-linux:latest
    environment:
      ACCEPT_EULA: Y
      SA_PASSWORD: yourStrong(!)Password
    ports:
    - 1433:1433

没关系。但现在我需要创建一个数据库并构建它的结构。我需要执行一些 sql 命令。 为了检查我是否能够做到这一点,我将command 添加到服务中:

services:
  tmp-db:
    image: microsoft/mssql-server-linux:latest
    environment:
      ACCEPT_EULA: Y
      SA_PASSWORD: yourStrong(!)Password
    command: /opt/mssql-tools/bin/sqlcmd -U sa -P yourStrong(!)Password -Q "SELECT [name] FROM sys.databases"
    ports:
    - 1433:1433

但是我得到了以下错误:

tmp-db_1  | Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : Login timeout expired.
tmp-db_1  | Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : TCP Provider: Error code 0x2749.
tmp-db_1  | Sqlcmd: Error: Microsoft ODBC Driver 13 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 Server 实例启动之前执行的。我该如何解决? Sql Server启动后如何执行一些sql?

【问题讨论】:

标签: sql-server docker docker-compose


【解决方案1】:

问题是容器中只执行一个命令。当您在docker-compose.yml 中指定命令时,它会覆盖默认命令,该命令应该启动容器。所以你有两个选择

手动运行命令

services:
  tmp-db:
    image: microsoft/mssql-server-linux:latest
    environment:
      ACCEPT_EULA: Y
      SA_PASSWORD: yourStrong(!)Password
    ports:
    - 1433:1433

然后就可以执行了

docker-compose exec tmp-db /opt/mssql-tools/bin/sqlcmd -U sa -P yourStrong(!)Password -Q "SELECT [name] FROM sys.databases"

有两种服务——一种用于服务器,一种用于数据加载

services:
  load-db:
    image: microsoft/mssql-server-linux:latest
    command: sh -c 'sleep 10 && /opt/mssql-tools/bin/sqlcmd -U sa -P yourStrong(!)Password -Q "SELECT [name] FROM sys.databases"'
    network_mode: service:tmp-db
  tmp-db:
    image: microsoft/mssql-server-linux:latest
    environment:
      ACCEPT_EULA: Y
      SA_PASSWORD: yourStrong(!)Password
    ports:
    - 1433:1433

在这种方法中,我们使用命令启动另一个容器来加载我们的数据,我们在我们的数据库服务器容器的网络上运行它。这样做只是为了避免使用数据库的主机名,如果您愿意,也可以将主机名传递为 tmp-db 并删除 network_mode: service:tmp-db

【讨论】:

  • 数据加载的两种服务方法对我来说是一种新方法,好主意+1
  • @Tarun Lalwani,谢谢,好方法。但是,如果我运行相同的文件,我会得到Unsupported config option for services.load-db: 'network'。如果我添加-H tmp-db 我会遇到问题中描述的问题。如何正确设置主机?
  • 我的错应该是network_mode而不是network
  • 如果你想直接设置主机没有network_mode你应该使用-S tmp-db而不是-H
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 2019-05-21
  • 2021-01-13
  • 2020-01-23
  • 2019-03-11
  • 1970-01-01
相关资源
最近更新 更多