将本地文件存储在Docker Volume中以供共享

rkttyhzu  于 2023-02-03  发布在  Docker
关注(0)|答案(1)|浏览(122)

我是新来的Docker,所以这可能是一个明显的问题,我只是没有使用正确的搜索词来找到答案,所以我道歉,如果是这样的话。
我正尝试使用专门构建的容器来建立新的CI/CD管道。到目前为止,我一直在使用其他人的容器,但我需要对可用依赖项进行更多控制,因此我需要自己的容器。为此,我构建了一个容器(Ubuntu),并且我有一个本地(host)目录中的依赖项,另一个目录中的是我正在构建的项目,两者都使用Docker Volumes(-v选项)连接到容器,如下所示。

docker run --name buildbox \
-v /projectpath:/home/project/ \
-v /dependencies:/home/libs \
buildImage buildScript.sh

由于这个目录最终会保存在Docker repo中,并由GitLabCI/CDPipeline访问,我希望将依赖项目录存储在一个尽可能小的容器中,这样我就可以将其与Ubuntu构建容器一起推送到Docker repo中。(--volumes-from),并使用-v选项Map要构建的项目;例如:

docker run --name buildbox \
-v /projectpath:/home/project/ \
--volumes-from depend_vol \
buildImage buildScript.sh

因此,我从Docker存储库中取出buildImage和depend_vol,运行buildImage,同时将依赖项容器和项目目录作为卷附加,然后运行构建脚本(并在完成后提取构建工件)。我希望将它们分开的原因是,如果我想创建使用公共库的不同构建容器,或者如果我想创建版本特定的依赖性容器而不存储完整的操作系统(我对此有计划)。
现在,我可以启动一个轻量级的通用容器(如busybox),并将所有内容复制到其中,但我想知道是否有一种简单的方法来连接卷,然后在容器关闭时将内容存储在映像中。
但是我想把我的本地主机依赖项目录存储在一个容器中。有没有一种直接的方法可以做到这一点?我是否错过了一些明显的东西?

tzdcorbm

tzdcorbm1#

因此,这是可行的,如果不是我所希望的,因为我仍然在做大量的文件复制(只是用tarball)。

# Create a tarball of the files on the host to store, don't store the full path
tar -cvf /home/projectFiles.tar -C /home/projectFiles/ .

# Start a lightweight docker container (busybox) with a volume connection to the host (/home:/backup), then extract the tarball into the container
# cd to the drive root and untar the tarball
docker run --name libraryVolume \
  -v /home:/backup \
  busybox \
  /bin/sh -c \
  "cd / && mkdir /projectLibs && tar -xvf /backup/projectFiles.tar -C /projectLibs"

# Don't forget to commit the container image
docker commit libraryVolume

就这样。然后推到回收站。
要使用它,请拉取存储库,然后启动数据卷:

docker run --name projLib \
  -v /projectLibs \
  --entrypoint "/bin/sh" \
  libraryVolume

然后启动将要引用数据卷(projLib)的容器(projBuild)。

docker run --it --name projBuild \
  --volumes-from=projLib \
  -v /home/mySourceCode:/buildProject \
  --entrypoint /buildProject/buildScript.sh \
  builderImage

好像有用。

相关问题