我们有什么办法可以在 Dockerfile 中写入 docker cli 上使用的 -v 命令吗?

我们有什么办法可以在 Dockerfile 中写入 docker cli 上使用的 -v 命令吗?

假设我有一个本地目录结构 /var/lib/jenkins,并且在生成的容器上我也拥有相同的目录结构。现在,我需要通过 Dockerfile 创建的 jenkins 用户能够访问本地计算机上的 /var/lib/jenkins/.m2/repository。我已使用 Dockefile 中的 usermod 和 groupmod 将容器 jenkins 用户 ID 映射到本地的 jenkins 用户 ID。但是,我需要本地的 /var/lib/jenkins/.m2/repository 应该可以在容器内供其上的所有进程访问,这样本地计算机的存储库就会映射到容器路径

实际上,我需要在dockerfile中实现以下cmd

docker run -it  --name my_container -v /var/lib/jenkins/.m2/repository:/var/lib/jenkins/.m2/repository my_image

对此的任何指导都会有帮助。

谢谢!

答案1

您无法在 Dockerfile 中定义卷源,因为镜像可能在不同的环境中运行,而这些环境中的源可能会发生变化。因此,虽然您可以告诉 Docker 镜像在 处有一个卷/var/lib/jenkins/.m2/repository,但您无法告诉镜像将该卷映射到主机目录/var/lib/jenkins/.m2/repository。要指定运行时配置,您可以在 docker-compose.yml 文件中使用卷部分指定此项,例如:

version: '3'
services:
  svcname:
    image: my_image
    volumes:
    - /var/lib/jenkins/.m2/repository:/var/lib/jenkins/.m2/repository

我个人建议不要在 Dockerfile 中定义卷。如果您在运行时未指定卷源,它将生成匿名卷。并且,如果您想在RUN定义卷后使用 Dockerfile 中的命令对此目录进行更改,则这些更改将不会保存到您的映像中,并且会在行完成后丢失RUN

答案2

是的,您可以使用VOLUME指令,在您的示例中,行将看起来像

VOLUME /var/lib/jenkins/.m2/repository

详细描述 文档

相关内容