簡體   English   中英

如何將文件路徑傳遞到Docker文件中

[英]How to pass a filepath into a docker file

我正在嘗試構建一個簡單的容器,該容器將允許用戶將目錄文件路徑傳遞到主機上應存在的可執行文件。

我想要這種靈活的方式,如果用戶未指定目錄文件路徑,它將使用默認路徑。 根據我的研究,我需要在運行時使用ARG並可能使用-e標志 讓我們通過這個簡單的Dockerfile來看一個例子。

FROM ubuntu:latest
#Assign the default value
ARG DIRHOME=/opt/docker/q
#if -e has not been set the use default DIRHOME
ADD $DIRHOME /q

Dockerfile駐留在我將運行的文件夾/ opt / docker中

docker build --build-arg DIRHOME=/q .

所有這些都成功運行,但是如您所見,我一直在使用默認值。 用戶是否可以在運行時將其文件路徑傳遞給q可執行文件以覆蓋DIRHOME變量? 像下面這樣

docker run -e "QHOME=/user1/lib/q" <container id>

我認為這與構建上下文有關,因此,如果我在/ opt / docker中運行我的Dockerfile,則它將其視為根目錄,並且找不到路徑/ user1 / lib / q。 任何潛在的解決方法?

運行DIRHOME build時,您從DIRHOME復制文件。 因此,構建后DIRHOME沒有任何實際用途。 將容器內部的路徑設置為環境變量會更有意義:

ENV qpath /q
ADD /opt/docker/q $qpath

然后,當您嘗試使用docker run映像時, docker run標准方法是使用卷將數據從主機傳遞到容器。 然后您可以使用環境變量:

docker run -v /user1/lib/q:/q image

通常,這里有用的模式是在Docker容器內使用固定路徑,並讓管理員使用docker run -v選項將需要掛載的任何內容掛載到該容器中。 絕對不需要主機路徑和容器路徑匹配。 路徑名可以是Dockerfile中的固定屬性,不是您特別希望通過ARG進行配置的名稱。

例如,如果這是某種安全掃描程序,則管理員可以運行

sudo docker run \
  -v $GOPATH/bin:/scan \
  myscanner \
  myprogram

掃描器將查看/scan/myprogram 但在主機上將是$GOPATH/bin/myprogram

如果您程序的主要目標是使用主機上的文件,請考慮將Docker 作為設計目標使使用主機文件變得困難; 除了此卷映射問題之外,如果您想從Docker內部運行此作業,還會出現文件系統權限反復出現的問題以及更多的問題。 考慮使用一些更簡單的打包機制(分發靜態鏈接的二進制文件,Python虛擬環境,RPM或dpkg軟件包等)。 作為用戶,我寧願跑步

myscanner $(which myprogram)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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