【问题标题】:Reading input files with docker使用 docker 读取输入文件
【发布时间】:2018-05-13 17:23:45
【问题描述】:

我正在编写一个运行如下的 C++ 程序:

./program data_file config_file

我想使用 docker。我写了以下Dockerfile

FROM gcc:7.2.0
ENV MYP /repo
WORKDIR ${MYP}
COPY . ${MYP}

RUN /bin/sh -c 'make'
ENTRYPOINT ["./program"]
CMD ["file1", "file2"]

所以我docker build -t test . 它并使用docker run test 并看到一切正常,默认设置。

但是,如果我修改 file1,例如在我的工作目录中(构建后),我注意到当我运行 docker run test file1 file2 时,调用的 file1 是容器内部的那个,并且作为参数输入的那个将被忽略。

同样,如果我使用重命名的数据和配置文件并运行docker run test file3 file4,我会收到错误消息,指出这些文件不存在(因为它们不在容器中)。

那么,如何让 docker 识别这些作为参数传递的输入文件,避免使用图像中包含的文件?

Docker 版本为 18.04.0-ce,构建 3d479c0af6。

编辑

另一种选择是使用launch.sh 脚本,例如:

#!/bin/sh
./program "${DATA_FILE}" "${CONFIG_FILE}"

所以ENTRYPOINTCMD 指令被Dockerfile 中的以下行替换:

CMD ["./launch.sh"]

但是现在如果我运行:

docker run test -e DATA_FILE=file1 -e CONFIG_FILE=file2

我收到权限错误...

docker:来自守护进程的错误响应:OCI 运行时创建失败:container_linux.go:348:启动容器进程导致“exec:\”-e\”:$PATH 中找不到可执行文件”:未知。 ERRO[0000] 错误等待容器:上下文已取消

【问题讨论】:

  • 可能重复[将文件作为参数传递给 Docker 容器](stackoverflow.com/questions/41092587/…)
  • 如果没有答案则不重复,请在标志说明中阅读
  • 您可能希望使用卷在主机和容器之间挂载文件。例如,docker run -v /path/to/file:/program/ test file3 file4

标签: c++ docker


【解决方案1】:

您可以使用volume mechanism 将主机目录挂载到容器中。

在主机的某个目录中创建file1.txtfile2.txt 文件。例如,我们在/var/dir1/ 目录中创建文件。
您在 docker 容器中的工作目录是 /program

因此,当您运行 docker 时,您应该使用 -v flag 将此主机目录挂载到容器中

docker run -v /var/dir1/:/program test file1.txt file2.txt

哦,我知道我们为什么会遇到问题。

当我将主机目录安装到工作目录时,我实际上是从它的工作目录中删除容器内所有创建的文件,包括./program 二进制文件。所以docker run 命令失败。
因此我们不必挂载工作目录。例如,我们可以挂载工作目录的子目录。

 docker run -v /var/dir1/:/program/dir test dir/file1.txt dir/file2.txt 

它对我有用!

【讨论】:

  • 这也会产生错误。当我创建一个~/tmp 目录并在那里设置file1 和file2 时,我运行docker run -v /home/user/tmp/:/program test file1 file2 并得到以下信息: docker run -v ~/tmp/:/program test file1 file2 docker: Error response from daemon: OCI运行时创建失败:container_linux.go:348:启动容器进程导致“exec:\”./program\“:stat ./program:没有这样的文件或目录”:未知。 ERRO[0001] 错误等待容器:上下文取消
  • @EuGENE 运行docker run -v /home/user/tmp/:/program test 会得到什么?
  • 产生同样的错误:docker: Error response from daemon: OCI runtime create failed: container_linux.go:348: starting container process caused "exec: \"./program\": stat ./program:没有这样的文件或目录”:未知。 ERRO[0000] 错误等待容器:上下文取消
  • @EuGENE,我发现了问题。我首先为我的疏忽道歉。
  • 没什么可道歉的。其实我欠你的,非常感谢!!现在可以了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-28
  • 2015-06-11
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 2020-12-06
  • 1970-01-01
相关资源
最近更新 更多