gpt4 book ai didi

linux - Docker:将镜像的original/docker-entrypoint.sh挂载到一个读/写模式的卷中

转载 作者:太空宇宙 更新时间:2023-11-04 11:45:24 26 4
gpt4 key购买 nike

我尝试将图像的原始 /docker-entrypoint.sh 以读/写模式挂载到卷,以便能够从外部轻松更改它(无需进入容器)然后重启容器观察变化。

我这样做(在 ansible 中)是这样的:

/app/docker-entrypoint.sh:/docker-entrypoint.sh:rw

如果 /app/docker-entrypoint.sh 在主机上不存在,目录 /app/docker-entrypoint.sh (不是文件,因为wish) 被创建,我得到以下错误:

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-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。文件

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镜像的内容。

解决方法

  • 挂载一些目录,然后将入口点命名为备份
  • 在入口点中添加指令以在运行时将入口点复制到该位置
  • 因此它将在主机目录上创建新文件
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

关于linux - Docker:将镜像的original/docker-entrypoint.sh挂载到一个读/写模式的卷中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57942758/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com