为什么我的装载docker工具卷文件变成容器内的文件夹?

这个场景是Docker内部/旁边的docker,通过一个socks绑定,以便为CI / CD工具(在这种情况下,VSTS)提供一个易于部署和扩展的runner代理。 这样做的原因是,我想testing的各种项目使用docker / compose来运行testing,并configuration一个CI / CD工作者兼容docker/撰写一堆繁琐和耗时。 (这将最终被部署到4 + Kubernetes集群)

无论如何,这个问题:

重复步骤

  1. 运行vsts-agent映像

docker run \ -it \ -v /var/run/docker.sock:/var/run/docker.sock \ nullvoxpopuli/vsts-agent-with-aws-ecr:latest \ /bin/bash

  1. 运行另一个图像(模拟docker/撰写运行testing)

echo 'test' > test-file.txt docker run -it -v file-test.txt:/file-test.txt busybox /bin/sh

  1. 检查是否存在test-file.txt

cd / ls -la # shows that test-file.txt is a directory

所以,
– 为什么文件被安装为容器内的文件夹?
– 我需要做什么才能使卷正确安装?

解决schemeA – 感谢@BMitch

 # On Host machine docker run -it \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /tmp/vsts/work/:/tmp/vsts/work \ nullvoxpopuli/vsts-agent-with-aws-ecr:latest \ /bin/bash # In vsts-agent-with-aws-ecr cd /tmp/vsts/work/ git clone https://NullVoxPopuli@bitbucket.org/group/project.git cd project/ ./scripts/run/eslint.sh # Success! (this uses docker-compose to map files to the node-based docker image) 

Docker从docker主机创建容器并装入卷。 任何时候卷挂载的文件或目录都不存在,它将被初始化为空目录。 因此,如果从容器内运行docker命令到docker套接字,那么这些命令会在docker主机上的容器之外解释,而docker主机上的文件不存在。 此外, docker run命令需要一个完整的路径来挂载当你需要一个主机卷的卷,否则它被解释为一个命名卷。

你现在想要做的是:

 docker volume rm file-test.txt docker run -it -v $(pwd)/file-test.txt:/file-test.txt busybox /bin/sh 

相反,如果您试图将容器内的文件包含到其他容器中,则可以使用输入重定向来初始化命名卷,如下所示:

 tar -cC . . | docker run -i --rm -v file-test:/target busybox tar -xC /target docker run -it -v file-test:/data busybox /bin/sh 

它使用tar将当前目录的内容复制到由交互式docker命令处理的stdout中,然后将这些目录内容提取到作为已命名卷的容器内的/ target中。 请注意,由于命名卷是目录,因此我没有在第二个示例中以root用户装入卷,我不想替换根文件系统。

另一种选择是在Docker主机上的多个容器之间共享一个卷装入点,以便在一个容器中编辑的文件进入到装载到其他容器的主机中,并在其中显示:

 docker run \ -it \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /container-data:/container-data \ nullvoxpopuli/vsts-agent-with-aws-ecr:latest \ /bin/bash echo 'test' > /container-data/test-file.txt docker run -it -v /container-data:/container-data busybox /bin/sh 

如果这些文件可能在容器运行时被修改,我不建议将单个文件安装到容器中。 文件更改通常会导致inode更改,docker将旧的inode安装到容器中。 因此,在容器内部或外部更改到文件可能不会在另一侧看到,并且如果您修改容器内的文件,删除容器时可能会丢失该更改。 inode问题的解决方案是将整个目录安装到容器中。