为什么我安装的docker卷文件会变成容器内的文件夹?

时间:2017-04-28 17:17:09

标签: linux docker azure-devops mount

该场景是通过sock绑定在docker内部/旁边的docker,目的是为C.I./C.D提供易于部署和可扩展的runner代理。工具(在这种特殊情况下,VSTS)。这个设置的原因是我想测试的各种项目使用docker / compose来运行测试和配置C.I./C.D.工人与docker兼容/撰写一堆时间变得繁琐且耗时。 (这将最终部署到4+ Kubernetes Clusters)

无论如何,问题是:

复制步骤

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

    1. 运行另一个图像(模拟docker / compose running tests)
    2. echo 'test' > test-file.txt docker run -it -v file-test.txt:/file-test.txt busybox /bin/sh

      1. 检查是否存在test-file.txt
      2. 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)
        

1 个答案:

答案 0 :(得分:2)

Docker从docker主机创建容器并安装卷。只要卷装入中的文件或目录不存在,它就会被初始化为空目录。因此,如果您正在从容器内部到docker socket运行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将当前目录的内容复制到stdout,stdout由交互式docker命令处理,然后将这些目录内容提取到容器内的/ 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问题的解决方案是将整个目录挂载到容器中。

相关问题