如何将文件路径传递到docker文件中

问题描述 投票:0回答:2

我正在尝试构建一个简单的容器,允许用户将目录文件路径传递给主机上应该存在的可执行文件。

我希望这有点灵活,如果用户没有指定目录文件路径,它将使用默认路径。根据我的研究,我需要在运行时使用ARG和潜在的-e flag。让我们通过这个简单的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,那么它会将其视为root,并且找不到路径/ user1 / lib / q。有任何潜在的解决方法吗?

docker dockerfile docker-container docker-image
2个回答
1
投票

运行docker build时,从docker镜像中的DIRHOME复制文件。所以在构建之后没有真正使用DIRHOME。将环境中的路径设置为环境变量更有意义:

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

然后,当您尝试使用docker run运行映像时,将数据从主机传递到容器的标准方法是使用卷。那么你可以使用环境变量:

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

1
投票

一般来说,这里有用的模式是使用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)
© www.soinside.com 2019 - 2024. All rights reserved.