在Docker容器启动后运行命令 [英] Run command after docker container is started
问题描述
我准备了一个docker-compose文件来部署带有数据库的容器:
I've prepared a docker-compose file to deploy container with database:
services:
tmp-db:
image: microsoft/mssql-server-linux:latest
environment:
ACCEPT_EULA: Y
SA_PASSWORD: yourStrong(!)Password
ports:
- 1433:1433
没关系。但是现在我需要创建一个数据库并建立其结构。我需要执行一些sql命令。
为了检查我是否能够做到这一点,我在服务中添加了 command
:
It is okay. But now I need to create a database and build its structure. I need to execute some sql commands.
To check if i am able to do this I added command
to the service:
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?
I feel the command is executed before Sql Server instance is started. How can I fix it? How can I execute some sql after Sql Server is started?
推荐答案
问题是在容器中仅执行了一个命令。当您在 docker-compose.yml
中指定命令时,它将覆盖默认命令,该命令原应启动容器。因此,您有两个选择
The issue is that only one command is executed in a container. When you specify the command in docker-compose.yml
it overrides the default command, which was supposed to start the container. So you have two options
手动运行命令
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
。
In this approach we launch another container with the command to load our data, we run it on the network of our DB server container. This is done just to avoid the host name of the DB, if you prefer you can pass the host name also as tmp-db
and remove the network_mode: service:tmp-db
.
这篇关于在Docker容器启动后运行命令的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!