簡體   English   中英

為什么我安裝的docker卷文件會變成容器內的文件夾?

[英]Why are my mounted docker volume files turning into folders inside the container?

該方案是通過sock綁定在docker內部/旁邊的docker,目的是為CI / CD工具提供易於部署和可擴展的運行代理(在此特定情況下為VSTS)。 這個設置的原因是我想要測試的各種項目使用docker / compose來運行測試,並且配置CI / CD工作器與docker / compose兼容很多次會變得麻煩和耗時。 (這最終將部署到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 / compose運行測試)

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

所以,
- 為什么文件作為文件夾安裝在容器中?
- 要使卷正確安裝,我需要做什么?

解決方案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)

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,后者由交互式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問題的解決方案是將整個目錄安裝到容器中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM