簡體   English   中英

使用Docker讀取輸入文件

[英]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 file4docker run test file3 file4收到一條錯誤消息,指出這些文件不存在(因為它們不在容器中)。

因此,如何使docker識別作為參數傳遞的這些輸入文件,從而避免使用映像中包含的文件?

Docker版本為18.04.0-ce,內部版本3d479c0af6。

編輯

另一種選擇是使用launch.sh腳本,例如:

#!/bin/sh
./program "${DATA_FILE}" "${CONFIG_FILE}"

因此ENTRYPOINTCMD指令被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.txtfile2.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM