我正在尝试构建一个简单的容器,允许用户将目录文件路径传递给主机上应该存在的可执行文件。
我希望这有点灵活,如果用户没有指定目录文件路径,它将使用默认路径。根据我的研究,我需要在运行时使用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 build时,从docker镜像中的DIRHOME
复制文件。所以在构建之后没有真正使用DIRHOME
。将环境中的路径设置为环境变量更有意义:
ENV qpath /q
ADD /opt/docker/q $qpath
然后,当您尝试使用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)