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

时间:2018-08-17 19:10:42

标签: docker docker-windows

我们正在尝试构建一个包含完整应用程序的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发行版,所以这不是一个好主意。我们需要将该图像作为Linux Postgres容器。

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

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

有这样的命令吗?如果没有,我们如何在Docker中实现这种情况?

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:1)

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

很显然,您来自某种状态,在使用某些导入工具之前,您已经做好了postgres的工作。现在您可以通过启动postgres容器(没有dockerfile,只有docker / kubernetes)来模仿该策略。然后运行导入工具,停止postgres-container,并使用“ docker commit”对结果进行快照。提交的映像将用于部署的下一阶段。

相关问题