[英]Reading input files with 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 run test file3 file4
收到一條錯誤消息,指出這些文件不存在(因為它們不在容器中)。
因此,如何使docker識別作為參數傳遞的這些輸入文件,從而避免使用映像中包含的文件?
Docker版本為18.04.0-ce,內部版本3d479c0af6。
編輯
另一種選擇是使用launch.sh
腳本,例如:
#!/bin/sh
./program "${DATA_FILE}" "${CONFIG_FILE}"
因此ENTRYPOINT
和CMD
指令被ENTRYPOINT
的以下行替換:
CMD ["./launch.sh"]
但是現在,如果我運行:
docker run test -e DATA_FILE=file1 -e CONFIG_FILE=file2
我收到權限錯誤...
泊塢窗:來自守護程序的錯誤響應:OCI運行時創建失敗:container_linux.go:348:啟動容器進程導致“ exec:\\”-e \\”:在$ PATH中找不到可執行文件”:未知。 ERRO [0000]錯誤,正在等待容器:上下文已取消
您可以使用卷機制將主機目錄掛載到容器。
在主機的某個目錄中創建file1.txt
和file2.txt
文件。 例如,我們在/var/dir1/
目錄中創建文件。
您在Docker容器中的工作目錄是/program
。
因此,當您運行docker時,應使用-v標志將此主機目錄掛載到容器
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
這個對我有用!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.