Py学习  »  docker

从停止的docker容器中删除文件(不创建新图像)

rzlvmp • 3 年前 • 1511 次点击  

我有一些简单的服务容器。

当我在不停止这个容器的情况下重新启动服务器时,我无法再次启动它。

错误消息是:

pidfile found, try stopping another running service or delete /var/run/service.pid

我知道我可以

  1. 从映像运行新容器并删除已停止的容器
  2. 从停止的容器创建新映像,并使用新入口点重新运行它。差不多 rm -f /var/run/service.pid && original_entrypoint.sh

但我只想做一些

docker rm_file container:/var/run/service.pid; docker start container

因为它是最简单、最快速的解决方案。

不完全重建容器的fs就无法访问它吗?这个手术看起来很有用。。。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/132320
 
1511 次点击  
文章 [ 2 ]  |  最新文章 3 年前
rzlvmp
Reply   •   1 楼
rzlvmp    4 年前

用别人的提示自己回答 answer

  1. 查找docker主机上存储的目录:

    export LOCAL_DIR=$(docker inspect -f '{{ .GraphDriver.Data.UpperDir }}' container_name)
    
  2. 在本地删除文件:

    sudo rm -f ${LOCAL_DIR}/run/service.pid
    
  3. 运行容器:

    docker start container_name
    

或是一应俱全:

sudo rm -f "$(docker inspect -f '{{ .GraphDriver.Data.UpperDir }}' container_name)/run/service.pid" && docker start container_name
David Maze
Reply   •   2 楼
David Maze    4 年前

总是 删除旧容器并运行新容器。这对每个应用程序和运行时都是一致的,不涉及如何手动将容器文件系统重置为初始状态。我几乎从不使用 docker start .

docker rm container_name
docker run -d --name container_name ...

如果您所在的环境中旧的pid文件可能会被留下(可能在绑定装载的主机目录中),则可以使用入口点包装脚本来清理它:

#!/bin/sh
rm -f /var/run/service.pid
exec "$@"

在Dockerfile中,将此脚本设置为 ENTRYPOINT .最后一行将运行图像的 CMD 作为主要的容器过程。

...
COPY entrypoint.sh . # must be executable, may already be there
ENTRYPOINT ["./entrypoint.sh"] # must be JSON-array form
CMD same as before

(你的问题提到 original_entrypoint.sh ; 如果已经进行了此设置,请在本地源代码树中编辑现有的入口点脚本,并添加 rm -f 在那里排队。)