使用docker读取输入文件 我写的C++程序运行如下: ./program data_file config_file

使用docker读取输入文件 我写的C++程序运行如下: ./program data_file config_file,c++,docker,C++,Docker,我想用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测试。it并使用docker运行测试,确保默认情况下一切正常 但是,如果我修改了file1,例如在我的工作目录中(构建之后),我注意到当我运行d

我想用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测试。
it并使用
docker运行测试
,确保默认情况下一切正常

但是,如果我修改了
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}"
因此,Dockerfile中的
ENTRYPOINT
CMD
指令将替换为以下行:

CMD ["./launch.sh"]
但是现在如果我跑步:

docker run test -e DATA_FILE=file1 -e CONFIG_FILE=file2
我得到一个权限错误

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

您可以使用将主机目录装载到容器。

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

所以,当您运行docker时,应该使用

哦,我知道我们为什么会有问题

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

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

这对我有用

[Passing file as argument to Docker container]()的可能重复项它不重复如果它没有答案,请在标志说明中读取它您可能希望使用卷在主机和容器之间装载文件。例如,
docker run-v/path/to/file:/program/test file3 file4
这也会生成一个错误。当我创建一个
~/tmp
目录并在其中设置file1和file2时,我运行
docker run-v/home/user/tmp/:/program test file1 file2
并获得以下结果:docker run-v~/tmp/:/program test file1 file2 docker:来自守护程序的错误响应:OCI运行时创建失败:容器\u linux。go:348:启动容器进程导致“exec:\”/program\”:stat./program:没有这样的文件或目录:unknown.ERRO[0001]等待容器时出错:上下文canceled@EuGENE运行
docker run-v/home/user/tmp/:/program test
时会得到什么?会生成相同的错误:docker:error-response-from-daemon:OCI-runtime-create-failed:container\u-linux。go:348:启动容器进程导致“exec:\”/program\”:stat./program:没有这样的文件或目录:未知。ERRO[0000]等待容器时出错:contextcanceled@EuGENE,我发现了问题。我首先为我的疏忽道歉。没什么可道歉的。事实上,我欠你的债,非常感谢!!现在它起作用了
 docker run -v /var/dir1/:/program/dir test dir/file1.txt dir/file2.txt