在Docker中将数据添加到现有命名卷的正确方法是什么?

时间:2016-05-26 18:45:52

标签: docker

我以旧方式使用Docker,使用卷容器:

docker run -d --name jenkins-data jenkins:tag echo "data-only container for Jenkins"

但现在我通过创建命名卷来改变新的方式:

 docker volume create --name my-jenkins-volume 

我将这个新卷绑定到一个新的Jenkins容器。 我唯一留下的是一个文件夹,其中我拥有我以前的jenkins容器的/var/jenkins_home。 (使用docker cp) 现在我想用该文件夹的内容填充我的新命名卷。

我可以将该文件夹的内容复制到/var/lib/jenkins/volume/my-jenkins-volume/_data吗?

6 个答案:

答案 0 :(得分:91)

可以将数据直接复制到/var/lib/docker/volumes/my-jenkins-volume/_data,但这样做是:

  • 依靠对docker主机的物理访问。如果您与远程docker api进行交互,这项技术将无法运行。

  • 依赖于卷实现的某个特定方面,将来可能会发生变化,打破您依赖它的任何流程。

我认为你最好依靠你可以通过命令行客户端使用docker api完成的事情。最简单的解决方案可能就是使用辅助容器,例如:

docker run -v my-jenkins-volume:/data --name helper busybox true
docker cp . helper:/data
docker rm helper

答案 1 :(得分:18)

您可以使用例如

将接受的答案减少到一行
docker run --rm -v `pwd`:/src -v my-jenkins-volume:/data busybox cp -r /src /data

答案 2 :(得分:4)

以下是将〜/ data 的内容复制到名为 my-vol

的Docker卷的步骤

步骤1.将卷附加到“临时”容器。对于在终端中运行的命令:

docker run --rm -it --name alpine --mount type=volume,source=my-vol,target=/data alpine

步骤2。将〜/ data 的内容复制到 my-vol 中。为此,请在新的终端窗口中运行以下命令:

cd ~/data docker cp . alpine:/data

这会将〜/ data 的内容复制到 my-vol 卷中。复制后,退出临时容器。

答案 3 :(得分:1)

如果您不想创建 docker 并且您可以作为特权用户访问 ,只需执行以下操作(在 Linux 系统上):

docker volume create my_named_volume
sudo cp -p . /var/lib/docker/volumes/my_named_volume/_data/

此外,它还允许您在 docker 运行时或在 docker 容器停止的情况下访问数据。

答案 4 :(得分:1)

您可以将此 BASH 函数添加到您的 .bashrc 以将文件复制到现有的 Docker 卷,而无需运行容器

# Usage: copy-to-docker-volume SRC_PATH DEST_VOLUME_NAME [DEST_PATH]
copy-to-docker-volume() {
  SRC_PATH=$1
  DEST_VOLUME_NAME=$2
  DEST_PATH="${3:-}"
  # create smallest Docker image possible
  echo -e 'FROM scratch\nLABEL empty=""' | docker build -t empty -
  # create temporary container to be able to mount volume
  CONTAINER_ID=$(docker container create -v my-volume:/data empty cmd)
  # copy files to volume
  docker cp "${SRC_PATH}" "${CONTAINER_ID}":"/data/${DEST_PATH}"
  # remove temporary container
  docker rm "${CONTAINER_ID}"
}

示例

# create volume as destination
docker volume create my-volume
# create directory to copy
mkdir my-dir
echo "hello file1" > my-dir/my-file-1
# copy directory to volume
copy-to-docker-volume my-dir my-volume
# list directory on volume
docker run --rm -it -v my-volume:/data busybox ls -la /data/my-dir
# show file content on volume
docker run --rm -it -v my-volume:/data busybox cat /data/my-dir/my-file-1

# create another fil to copy
echo "hello file2" > my-file-2
# copy file to directory on volume
copy-to-docker-volume my-file-2 my-volume my-dir
# list (updated) directory on volume
docker run --rm -it -v my-volume:/data busybox ls -la /data/my-dir
# check volume content
docker run --rm -it -v my-volume:/data busybox cat /data/my-dir/my-file-2

答案 5 :(得分:0)

您无需启动某个容器即可将数据添加到已经存在的命名卷中,只需创建一个容器并在其中复制数据即可:

docker container create --name temp -v my-jenkins-volume:/data busybox
docker cp . temp:/data
docker rm temp