gpt4 book ai didi

docker - 在Docker中,如何从容器内部检测Docker是否挂载了文件或目录?

转载 作者:行者123 更新时间:2023-12-02 20:33:32 25 4
gpt4 key购买 nike

我做了docker-compose down / docker container rm,发现我丢失了在容器中创建的所有数据。是的,我首先忘记将本地目录挂载为卷。 😭

为防止这种情况,在启动时,我想警告用户:如果未装载本地卷,则“数据将是非持久性的”。

有没有一种方法可以从容器内部检测文件或目录是否已通过Docker挂载?

我用谷歌搜索,但是找不到一个好的方法。我当前的解决方法是:

FROM alpine:latest

RUN \
mkdir /data && \
touch /data/.replaceme
...

ENTRYPOINT /detect-mount-and-start.sh

detect-mount-and-start.sh检查 /data/.replaceme是否存在。如果是这样,它将发出警告以挂载本地卷并退出。

有更好的检测方法吗?

注意(2019/09/12):此容器不仅通过 docker-compose up使用,而且还通过 docker run --rm使用。并且未指定本地目录名称。意思是,它可以是 -v $(pwd)/mydata:/data或类似 -v $(pwd)/data_local:/data等。

注意(2019/09/15):这种情况是:我启动了Markdown Editor容器,并创建了100个 .md文件。这些文件保存在容器根目录的 /data上。我应该在所有内容之前都安装 -v $(pwd)/data:/data之类的卷。但是我没有...并且在取出容器后注意到了它。我知道,我的坏。

最佳答案

您的操作方式也可能有效,但是我正在开发环境中的一个项目上与我的一位客户一起工作,这是基于nodejs的应用程序,在启动容器之前,他们需要确保server.js存在,并且期望从安装位置获得server.js。所以我想出了这种方法,因为我没有找到感知容器内部共享docker卷的方法。

Docker文件

FROM alpine
run mkdir -p /myapp
copy . /myapp
copy entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

入口点
#!/bin/sh
APP_PATH="/myapp"
files=$(ls /myapp/*.js)
echo "Files in Docker mount location: $files"
if [ -f "$APP_PATH/server.js" ] && [ -f "$APP_PATH/index.js" ]; then
echo "Starting container with host mount files"
echo "Starting server.js"
cd $APP_PATH;
node server.js
else
>&2 echo "Error: Pls mount the host location on /myapp path of the container i.e -v host_node_project:/myapp. Current files $(ls $APP_PATH)"
break
fi

建立并运行
docker build -t myapp .
docker run -it --rm --name myapp myapp

enter image description here

关于docker - 在Docker中,如何从容器内部检测Docker是否挂载了文件或目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57863638/

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