如何在启动 docker 容器后由主机执行脚本
How to execute script by host after starting docker container
我有 docker-compose.yml 文件,我通过 DB 启动了一个容器
docker-compose up -d db
命令。
我需要通过主机执行脚本,简而言之,将转储导出到容器中的数据库。
所以,现在看起来像:
docker-compose up -d db
./script.sh
但我想将这两个命令合二为一。
我的问题是 “这可能吗?”
我发现 Docker Compose 不支持此功能。
我知道我可以用这些命令创建另一个脚本,但我只想离开
docker-compose up -d db
UPD:我想提一下我正在使用 mcr.microsoft.com/mssql/server:2017-latest
图片
此外,不得不再说一次我需要在主机上准确执行脚本
您不能使用 Docker 工具在主机系统上执行命令。 Docker 的一般设计要点是容器不应该影响主机。
没有什么能阻止您编写自己的 shell 脚本,该脚本 运行 在主机上执行您需要的步骤:
#!/bin/sh
docker-compose -d up
./wait-for.sh localhost 1433
./script.sh
(wait-for.sh
脚本与 的答案中描述的相同,不依赖于 Docker 健康检查。)
对于您的用例,可能 运行 将数据导入器放在单独的容器中。一个典型的设置可能是这样的;请注意,每次您 运行 docker-compose up
时,进口商都会 运行。您可能想要将其实际构建到一个单独的图像中。
version: '3.8'
services:
db: { same: as you have currently }
importer:
image: mcr.microsoft.com/mssql/server:2017-latest
entrypoint: ./wait-for.sh db 1433 -- ./script.sh
workdir: /import
volumes: [.:/import]
open-source 数据库容器通常也支持将脚本放在 /docker-entrypoint-initdb.d
中,在容器首次启动时执行,但 SQL 服务器映像似乎不支持这个;像 How can I restore an SQL Server database when starting the Docker container? 这样的问题有一个复杂的设置来复制这种行为。
我有 docker-compose.yml 文件,我通过 DB 启动了一个容器
docker-compose up -d db
命令。
我需要通过主机执行脚本,简而言之,将转储导出到容器中的数据库。
所以,现在看起来像:
docker-compose up -d db
./script.sh
但我想将这两个命令合二为一。 我的问题是 “这可能吗?”
我发现 Docker Compose 不支持此功能。
我知道我可以用这些命令创建另一个脚本,但我只想离开
docker-compose up -d db
UPD:我想提一下我正在使用 mcr.microsoft.com/mssql/server:2017-latest
图片
此外,不得不再说一次我需要在主机上准确执行脚本
您不能使用 Docker 工具在主机系统上执行命令。 Docker 的一般设计要点是容器不应该影响主机。
没有什么能阻止您编写自己的 shell 脚本,该脚本 运行 在主机上执行您需要的步骤:
#!/bin/sh
docker-compose -d up
./wait-for.sh localhost 1433
./script.sh
(wait-for.sh
脚本与
对于您的用例,可能 运行 将数据导入器放在单独的容器中。一个典型的设置可能是这样的;请注意,每次您 运行 docker-compose up
时,进口商都会 运行。您可能想要将其实际构建到一个单独的图像中。
version: '3.8'
services:
db: { same: as you have currently }
importer:
image: mcr.microsoft.com/mssql/server:2017-latest
entrypoint: ./wait-for.sh db 1433 -- ./script.sh
workdir: /import
volumes: [.:/import]
open-source 数据库容器通常也支持将脚本放在 /docker-entrypoint-initdb.d
中,在容器首次启动时执行,但 SQL 服务器映像似乎不支持这个;像 How can I restore an SQL Server database when starting the Docker container? 这样的问题有一个复杂的设置来复制这种行为。