[英]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.