该场景是通过sock绑定在对接器内部/旁边进行的,目的是为C.I./C.D.工具提供一个易于部署和可伸缩的运行代理(在本例中为VSTS)。设置这种设置的原因是,我想测试的各种项目使用docker/复合来运行测试,并且配置一个C.I./C.D.工作人员以与docker/compose兼容的时间变得非常麻烦和耗时。(这将最终部署到4+ Kubernetes集群中)
总之,问题是:
复制步骤
docker run \ -it \ -v /var/run/docker.sock:/var/run/docker.sock \ nullvoxpopuli/vsts-agent-with-aws-ecr:latest \ /bin/bash
echo 'test' > test-file.txt docker run -it -v file-test.txt:/file-test.txt busybox /bin/sh
cd / ls -la # shows that test-file.txt is a directory
所以,
解决方案A-感谢@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)发布于 2017-04-28 18:32:30
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将当前目录的内容复制到stdout,由交互式docker命令处理,然后将这些目录内容提取到容器内的/target中,容器是一个命名的卷。请注意,在第二个示例中,我没有在root中挂载卷,因为命名卷是目录,我不想替换根文件系统。
另一种选择是在码头主机上的多个容器之间共享一个卷挂载点,以便您在一个容器中编辑的文件转到主机,将它们安装到另一个容器中并在那里可见:
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更改,并将旧inode安装到容器中。因此,在另一边可能看不到容器内部或外部对文件的更改,如果在容器中修改文件,则在删除容器时可能会丢失该更改。inode问题的解决方案是将整个目录装入容器中。
https://stackoverflow.com/questions/43685625
复制相似问题