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

How to pass a filepath into a docker file

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

我希望这有点灵活,如果用户没有指定目录文件路径,它将使用默认文件路径。根据我的研究,我需要在 运行 时使用 ARG and potentially the -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>

我认为这个问题与构建上下文有关,所以如果我 运行 我的 Dockerfile 在 /opt/docker 中然后它将其视为它的根并且找不到路径 /user1/lib/q。任何潜在的解决方法?

当您 运行 构建 docker 时,您将 DIRHOME 中的文件复制到 docker 映像中。所以在构建之后 DIRHOME 没有真正的用处。将容器内的路径设置为环境变量会更有意义:

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

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

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

一般来说,这里有用的模式是在 Docker 容器内使用固定路径,并让管理员使用 docker run -v 选项安装任何需要安装的东西。绝对不要求主机和容器路径匹配。路径名称可以是 Docker 文件中的固定 属性,这不是您特别希望通过 ARG 进行配置的内容。

如果这是某种安全扫描器,比如说,管理员可以 运行

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

扫描仪会查看 /scan/myprogram;但在主机上会是 $GOPATH/bin/myprogram.

如果您的程序的主要目标是处理主机上的文件,请考虑 Docker 作为设计目标 使处理主机文件变得困难;除了这个卷映射问题之外,还有反复出现的文件系统权限问题,如果您想从 Docker 中 运行 这项工作,则会出现更多问题。考虑使用一些更简单的打包机制(分发静态链接二进制文件、Python 虚拟环境、RPM 或 dpkg 包,...)。作为用户,我更愿意 运行

myscanner $(which myprogram)