如何在启动 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? 这样的问题有一个复杂的设置来复制这种行为。