当前位置: 首页 > 面试题库 >

在Docker容器启动后运行命令

王昊
2023-03-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?


问题答案:

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



 类似资料:
  • 我有一个服务,我正在通过Rancher通过Docker-Compose提出。我遇到的问题是需要在容器部署后设置密码。

  • 问题内容: 我正在使用Search Guard插件来保护由多个节点组成的elasticsearch集群。这是我的Dockerfile: 初始化SearchGuard(创建内部用户并分配角色)。容器启动后,我需要运行脚本。这是问题所在:除非运行Elasticsearch,否则脚本将不会初始化任何安全性索引。 脚本的内容是: 现在,我只是在容器启动后手动运行脚本,但是由于我是在Kubernetes上运

  • 我见过一堆教程,它们似乎做了与我想做的相同的事情,但由于某种原因,我的Docker容器退出了。基本上,我在Docker容器中设置了一个Web服务器和几个守护进程。我通过一个名为的bash脚本来完成这一过程的最后部分,该脚本通过DockerFile中的CMD运行。如下所示: 我在Dockerfile中启动它,如下所示: 我可以看到,当我手动运行事情时(即使用-i-t/bin/bash进入映像),所有

  • 本文向大家介绍Docker 在后台运行容器,包括了Docker 在后台运行容器的使用技巧和注意事项,需要的朋友参考一下 示例 要使容器在后台运行,请-d在容器启动期间提供命令行选项: 该选项-d以分离模式运行容器。它也等效于-d=true。 处于分离模式的容器停止时不能自动删除,这意味着不能将--rm选项与-d选项结合使用。

  • 问题内容: 我看过很多教程似乎都在做我想做的事情,但是由于某种原因,我的Docker容器退出了。基本上,我正在Docker容器内设置一个Web服务器和一些守护程序。我通过bash脚本(在Dockerfile中通过CMD运行)完成了最后部分。看起来像这样: 然后在Dockerfile中启动它,如下所示: 我可以看到,当我手动运行事物时(即使用-i -t / bin / bash进入映像),所有服务都

  • 问题内容: 我使用以下命令创建了容器: 以下是命令: 真的没有太多要说的,我希望容器能启动并保持正常运行。这是日志: 问题答案: 您正在尝试运行,它是需要tty 才能运行的交互式外壳。使用,在“分离”模式下运行此命令实际上没有任何意义,但是您可以通过添加到命令行来做到这一点,以确保容器具有与其关联的有效tty并保持连接状态: 在启动分离的容器时,您通常会运行某种长期存在的非交互式进程(例如,或We