簡體   English   中英

Docker inside docker:文件丟失

[英]Docker inside docker: file missing

我在另一個 docker 容器內啟動 docker,我試圖讓文件在“最深”容器內可見。

我的第一個容器構建在python:3.8-slim圖像上,入口點是["python"]並且稱為test-client

我將其啟動為docker run --rm -it -v /home/.../inputs:/inputs -v /var/run/docker.sock:/var/run/docker.sock -.network... test-client start_client.py...

現在是內膽。 start_client.py ,我使用 docker docker==5.0.3庫運行它。

def check_docker():
    import time
    inputs = Mount('/inputs', 'inputs')
    client = docker.from_env()
    client.images.pull('apline')
    time.sleep(30) # I will explain this later
    output = client.containers.run(
        'apline', 'ls inputs -al',
         mounts=[inputs]
    ).decode('utf-8')
    for line in output.split('\n'):
        print(line)

所以。 我使用time.sleep有時間潛入第一個容器並檢查是否需要文件。 是的,我的文件在第一個容器中。 但是最深容器的 output 在inputs目錄中看不到任何文件。

我究竟做錯了什么?

您不能直接將一個目錄從一個容器掛載到另一個容器。 在您顯示的mounts選項中(以及在docker run -v和 Compose volumes:中)主機路徑始終是運行 Docker 守護程序的系統上的路徑。 如果您綁定安裝主機的 Docker 套接字,這些路徑將是主機上的路徑; 如果$DOCKER_HOST指向虛擬機或遠程機器,則路徑將是該系統上的路徑,而不是您本地的路徑。

但是,在您的具體示例中,您嘗試重新掛載的目錄本身已經是一個掛載。 如果將相同的主機位置掛載到兩個容器中,那么您將能夠看到這些文件。 我建議在環境變量中指定它

inputs = Mount('/inputs', os.getenv('INPUT_SOURCE', 'input'))

當你運行容器時,將該目錄作為變量傳入

INPUT_SOURCE="$PWD/inputs"
docker run --rm -it \
  -e INPUT_SOURCE \
  -v "$INPUT_SOURCE:/inputs" \
  --network ... \
  test-client \
  start_client.py ...

如果您像之前那樣在Mount object 中使用裸字符串input ,它將掛載(並自動創建)一個命名卷。 你可以用你的容器來檢查這個

docker run --rm -v inputs:/inputs test-client \
  -e 'print(os.listdir("/inputs"))'

(如果從 Dockerfile 中刪除ENTRYPOINT ["python"]行,則可以使用更簡單的 shell 語法)。

暫無
暫無

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

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