Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 启动docker容器后运行命令_Sql Server_Docker_Docker Compose - Fatal编程技术网

Sql server 启动docker容器后运行命令

Sql server 启动docker容器后运行命令,sql-server,docker,docker-compose,Sql Server,Docker,Docker Compose,我准备了一个docker compose文件,用于部署带有数据库的容器: services: tmp-db: image: microsoft/mssql-server-linux:latest environment: ACCEPT_EULA: Y SA_PASSWORD: yourStrong(!)Password ports: - 1433:1433 没关系。但是现在我需要创建一个数据库并构建它的结构。我需要执行一些sql命令。

我准备了一个docker compose文件,用于部署带有数据库的容器:

services:
  tmp-db:
    image: microsoft/mssql-server-linux:latest
    environment:
      ACCEPT_EULA: Y
      SA_PASSWORD: yourStrong(!)Password
    ports:
    - 1433:1433
没关系。但是现在我需要创建一个数据库并构建它的结构。我需要执行一些sql命令。 为了检查我是否能够执行此操作,我向服务中添加了
命令

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?

问题是容器中只执行一个命令。当您在
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

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

从Docker Hub页面查看此图像,MS建议以启动时设置模式和数据为例。数据加载的两个服务方法对我来说是一个新的、整洁的想法+1@Tarun拉尔瓦尼,谢谢你,好方法。但是,如果运行同一个文件,我会得到services.load-db:'network'不支持的配置选项。如果我添加
-H tmp db
,我会得到问题中描述的问题。如何正确设置主机?我的问题是,应该是
network\u mode
而不是
network
如果您想在没有
network\u mode
的情况下直接设置主机,您应该使用
-S tmp db
而不是
-H