是否存在在主机上执行参数的dockerfile运行命令?

是否存在在主机上执行参数的dockerfile运行命令?,docker,docker-for-windows,Docker,Docker For Windows,我们正在尝试构建一个Docker堆栈,其中包含完整的应用程序:一个Postgres数据库和至少一个web应用程序 当堆栈启动时,我们希望应用程序立即工作-不应该因为数据库设置或数据导入而有任何延迟。因此,在创建映像时,必须导入数据库模式(DDL)和初始数据 例如,这可以通过dockerfile中的RUN命令来实现 RUN psql.exe -f initalize.sql -h myhost -d mydatabase -U myuser RUN data-import.exe myhost m

我们正在尝试构建一个Docker堆栈,其中包含完整的应用程序:一个Postgres数据库和至少一个web应用程序

当堆栈启动时,我们希望应用程序立即工作-不应该因为数据库设置或数据导入而有任何延迟。因此,在创建映像时,必须导入数据库模式(DDL)和初始数据

例如,这可以通过dockerfile中的
RUN
命令来实现

RUN psql.exe -f initalize.sql -h myhost -d mydatabase -U myuser
RUN data-import.exe myhost mydatabase myuser
但是,AFAIU这将在Postgres容器内执行
data import.exe
,只有当Postgres容器是Windows容器时,它才能工作。我们的产品使用Linux Postgres发行版,所以这不是一个好主意。我们需要图像是一个LinuxPostgres容器

因此,自然的解决方案是在主机上执行
data import.exe
,如下所示:

  • 当我们运行
    docker build
    时,一个Linux Postgres容器被启动
  • 运行psql.exe…
    在Postgres容器中运行一些SQL命令
  • 现在,我们的
    数据导入.exe
    在主机上执行。它的Postgres客户端连接到容器中的数据库并导入数据
  • 数据导入完成后,数据将提交到映像,docker将构建一个包含Postgres数据库和导入数据的映像

有这样的命令吗?如果没有,我们如何在docker中实现此场景?

在docker中,应用程序数据通常与图像和容器分开存储;例如,您经常使用
docker run-v
选项将数据存储在主机目录或docker卷中,以使其超过容器的寿命。通常情况下,您不会尝试将数据烘焙到图像中,这既是因为缩放的原因,也是因为当容器退出时,任何更改都将丢失

正如您所描述的更高级别的问题,我可能会分发类似“测试工具包”的东西,其中包括
docker compose.yml
和基本数据目录。Docker Compose文件将使用包含以下数据的PostgreSQL库存容器:

postgres:
  image: postgres:10.5
  volumes:
    - './postgres:/var/lib/postgresql/data'

要回答您提出的特定问题,
docker build
步骤仅在docker容器空间内运行单个命令;它们不能运行任意主机命令,不能在包含
Dockerfile的树之外读取文件系统内容,也不能在容器之外写入任何类型的主机文件系统内容。

在Docker中,应用程序数据通常与图像和容器分开存储;例如,您经常使用
docker run-v
选项将数据存储在主机目录或docker卷中,以使其超过容器的寿命。通常情况下,您不会尝试将数据烘焙到图像中,这既是因为缩放的原因,也是因为当容器退出时,任何更改都将丢失

正如您所描述的更高级别的问题,我可能会分发类似“测试工具包”的东西,其中包括
docker compose.yml
和基本数据目录。Docker Compose文件将使用包含以下数据的PostgreSQL库存容器:

postgres:
  image: postgres:10.5
  volumes:
    - './postgres:/var/lib/postgresql/data'

要回答您提出的特定问题,
docker build
步骤仅在docker容器空间内运行单个命令;它们不能运行任意主机命令,不能在包含
Dockerfile的树之外读取文件系统内容,也不能在容器之外写入任何类型的主机文件系统内容。

使用正确的工具,Dockerfile不是万能的锤子


很明显,你来自一个在使用导入工具之前就有postgres的州。现在,您可以通过启动postgres容器(没有dockerfile,只有docker/kubernetes)来模拟该策略。然后运行导入工具,停止postgres容器,并使用“docker提交”对结果进行快照。提交的映像将用于部署的下一个阶段。

使用正确的工具,dockerfile不是万能的


很明显,你来自一个在使用导入工具之前就有postgres的州。现在,您可以通过启动postgres容器(没有dockerfile,只有docker/kubernetes)来模拟该策略。然后运行导入工具,停止postgres容器,并使用“docker提交”对结果进行快照。提交的映像将用于部署的下一个阶段。

不确定我是否理解第一段的最后一句话:为什么“烘焙”数据会对可伸缩性产生负面影响?我不是说大量的数据。是的,如果数据不存在于卷中,任何更改都将丢失。但这可能是一个理想的场景(例如,如果容器是CI/CD进程的后端),我不确定是否理解您第一段的最后一句话:“烘焙”数据为什么会对可伸缩性产生负面影响?我不是说大量的数据。是的,如果数据不存在于卷中,任何更改都将丢失。但这可能是一个理想的场景(例如,如果容器是CI/CD进程的后端)。这可能是答案:这可能是答案: