使用docker读取输入文件

时间:2018-05-12 18:45:31

标签: c++ docker

我正在编写一个运行如下的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 \":$ $中找不到可执行文件路径":未知。   ERRO [0000]错误等待容器:上下文取消

1 个答案:

答案 0 :(得分: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 

对我有用!