【发布时间】: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}"
所以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\”:$PATH 中找不到可执行文件”:未知。 ERRO[0000] 错误等待容器:上下文已取消
【问题讨论】:
-
可能重复[将文件作为参数传递给 Docker 容器](stackoverflow.com/questions/41092587/…)
-
如果没有答案则不重复,请在标志说明中阅读
-
您可能希望使用卷在主机和容器之间挂载文件。例如,
docker run -v /path/to/file:/program/ test file3 file4