簡體   English   中英

Docker:以讀/寫模式將映像的原始/docker-entrypoint.sh掛載到卷

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

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