[英]Docker: mount image's original /docker-entrypoint.sh to a volume in read/write mode
我嘗試以讀取/寫入模式將映像的原始/docker-entrypoint.sh
到卷,以便能夠從外部輕松更改它(無需進入容器),然后重新啟動容器以觀察更改。
我這樣做(在ansible中)是這樣的:
/app/docker-entrypoint.sh:/docker-entrypoint.sh:rw
如果/app/docker-entrypoint.sh
上不存在/app/docker-entrypoint.sh
,則會創建目錄/app/docker-entrypoint.sh
(不是文件,如所希望的),並且出現以下錯誤:
Error starting container e40a90eef1525f554e6078e20b3ab5d1c4b27ad2a7d73aa3bf4f7c6aa337be4f: 400 Client Error: Bad Request (\"OCI runtime create failed: container_linux.go:348: starting container process caused \"process_linux.go:402: container init caused \\\"rootfs_linux.go:58: mounting \\\\\\\"/app/docker-entrypoint.sh\\\\\\\" to rootfs \\\\\\\"/var/lib/docker/devicemapper/mnt/4d3e4f4082ca621ab5f3a4ec3f810b967634b1703fd71ec00b4860c59494659a/rootfs\\\\\\\" at \\\\\\\"/var/lib/docker/devicemapper/mnt/4d3e4f4082ca621ab5f3a4ec3f810b967634b1703fd71ec00b4860c59494659a/rootfs/docker-entrypoint.sh\\\\\\\" caused \\\\\\\"not a directory\\\\\\\"\\\"\": unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type
如果我在啟動容器之前觸摸/app/docker-entrypoint.sh
(並設置適當的權限)-容器將無法啟動並繼續重啟(我認為是因為/app/docker-entrypoint.sh
以及因此是內部/docker-entrypoint.sh
為空)。
如何將容器的/docker-entrypoint.sh
的原始內容安裝到外部?
如果要覆蓋docker-entry point,它應該是可執行文件,或者換句話說,您必須在主機中設置chmod +x your_mount_entrypoint.sh
,則可以掛載,否則將通過權限錯誤進行掛載。 作為入口點腳本應該是可執行的。
第二件事,如評論中所述,您可以更好地掛載文件,以將入口點腳本保留在docker docker-entrypoint/entrypoint.sh
類的目錄中。
或者,如果您要掛載特定文件,則兩個名稱應相同,否則入口點腳本將不會被覆蓋。
docker run --name test -v $PWD/entrypoint.sh:/docker-entrypoint/entrypoint.sh --rm my_image
要么
docker run --name test -v $PWD/entrypoint.sh:/docker-entrypoint/entrypoint.sh:rw --rm my_image
參見此示例,在dockerfile內部生成了入口點,您可以從任何腳本中覆蓋它,但是它應該是可執行的,並且應該掛載到docker-entrypoint
。 Docker文件
FROM alpine
RUN mkdir -p /docker-entrypoint
RUN echo -e $'#!/bin/sh \n\
echo "hello from docker generated entrypoint" >> /test.txt \n\
tail -f /test.txt ' >> /docker-entrypoint/entrypoint.sh
RUN chmod +x /docker-entrypoint/entrypoint.sh
ENTRYPOINT ["/docker-entrypoint/entrypoint.sh"]
如果您構建並運行它,您將
docker build -t my_image .
docker run -t --rm my_image
#output
hello from docker generated entrypoint
現在,如果你想超越
創建並設置權限host_path/entrypoint/entrypoint.sh
,例如entrypoint.sh
#!/bin/sh
echo "hello from entrypoint using mounted"
現在運行
docker run --name test -v $PWD/:/docker-entrypoint/ --rm my_image
#output
hello from entrypoint using mounted
更新:
如果安裝主機目錄,它將隱藏docker image的內容。
解決方法
FROM alpine
RUN mkdir -p /docker-entrypoint
RUN touch /docker-entrypoint/entrypoint.sh
RUN echo -e $'#!/bin/sh \n\
echo "hello from entrypoint" \n\
cp /docker-entrypoint/entrypoint.sh /for_hostsystem/ ' >> /docker-entrypoint/entrypoint.sh
RUN chmod +x /docker-entrypoint/entrypoint.sh
ENTRYPOINT ["/docker-entrypoint/entrypoint.sh"]
現在,如果您運行,您將在主機中擁有docker入口點,與您想要的相反
docker run --name test -v $PWD/:/for_hostsystem/ --rm my_image
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.