我正在编写一个运行如下的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}"
所以ENTRYPOINT
和CMD
指令被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]错误等待容器:上下文取消
答案 0 :(得分:1)
您可以使用volume mechanism将主机目录安装到容器中。
在主机的某个目录中创建file1.txt
和file2.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
对我有用!