繁体   English   中英

如何以编程方式使用 python 从 docker 容器卷中删除文件?

[英]How to delete a file from docker container volume with python programmatically?

我们的项目有一个 docker-compose.yml 文件。 我们的容器有一个卷。 我可以将一个.zip 文件添加到此卷中以进行测试。 然后我可以将 zip 文件提取到卷文件夹的子文件夹中。 但是我必须从子文件夹中删除不必要的文件和文件夹。 我只需要 HTML 文件即可进行此测试。 出于这个原因,我必须删除文件和目录。 我对文件使用“os.remove”方法,对非空目录使用“shutil.rmtree”方法。 但是,子文件夹中的 没有任何更改。 这些不必要的文件和目录不会从 docker 容器卷中删除。 你能帮我解决这个问题吗?

PRE_RELEASE_ZIP_FILE_FOLDER = "/app_testing_data/pre_release_test_folder/"

     for file_name in folder_list_array:
        if ensure_file_extension(file_name,"html") == False:
            if "." in file_name:                    
                try:
                    os.remove(Constant.PRE_RELEASE_ZIP_FILE_FOLDER+file_name)
                    logger.logCritical("os.remove -> file_name -> " +Constant.PRE_RELEASE_ZIP_FILE_FOLDER+file_name)
                    #os.unlink(Constant.PRE_RELEASE_ZIP_FILE_FOLDER+file_name)
                except Exception as e:
                    logger.logError("os.remove:"+str(e))
            else:
                try:
                    shutil.rmtree(Constant.PRE_RELEASE_ZIP_FILE_FOLDER+file_name)
                    logger.logCritical("shutil.rmtree -> file_name -> " +Constant.PRE_RELEASE_ZIP_FILE_FOLDER+file_name)
                except Exception as e:
                    logger.logError("shutil.rmtree:"+str(e))

            folder_list_array.remove(file_name)    

我的 for 循环逻辑看起来不错。 我不接受任何错误。

在此处输入图像描述

然后,我使用“exec -it bash”命令检查我的容器。 没有任何变化。 我需要删除 html 文件以外的文件。

在此处输入图像描述

编辑评论:

首先,我上传了一个.zip 文件并保存。

if ensure_file_extension(uploaded_zip.filename, "zip"):
                logger.logDebug("uploaded result : "+ str(ensure_file_extension(uploaded_zip.filename, "zip")))

                uploaded_zip_filename = uploaded_zip.filename
                ensure_dir_exists("/app_testing_data")

                # Directory
                directory = "pre_release_test_folder"
                # Parent Directory path
                parent_dir = "/app_testing_data"

                path = os.path.join(parent_dir, directory)

                try:
                    os.makedirs(path, exist_ok = True)
                    logger.logDebug("Directory '%s' created successfully" % directory)
                except OSError as error:
                    logger.logDebug("Directory '%s' can not be created" % directory)    

                zip_save_path = os.path.join(path, uploaded_zip_filename)
                uploaded_zip.save(zip_save_path)

然后我提取了这个.zip文件:

 zip_file_path = Constant.PRE_RELEASE_ZIP_FILE_FOLDER + self.targetKitName # self.targetKitName this is actually zip file name.

    with ZipFile(zip_file_path, 'r') as zipObj:# Extract all the contents of zip file in current directory
        zipObj.extractall(Constant.PRE_RELEASE_ZIP_FILE_FOLDER)

我可以成功提取。 您可以从上面 docker 容器执行程序的第二张图像中看到这一点。

在此处输入图像描述

我建议您将代码更改为以下内容(使用rm -rf而不是os.remove ,因为我们已经知道如何从这个答案中使用rm -rf解决它):

import subprocess

PRE_RELEASE_ZIP_FILE_FOLDER = "/app_testing_data/pre_release_test_folder/"

     for file_name in folder_list_array:
        if ensure_file_extension(file_name,"html") == False:
            if "." in file_name:                    
                try:
                    subprocess.run(["rm", f"'{Constant.PRE_RELEASE_ZIP_FILE_FOLDER+file_name}'"])
                    logger.logCritical("os.remove -> file_name -> " +Constant.PRE_RELEASE_ZIP_FILE_FOLDER+file_name)
                    #os.unlink(Constant.PRE_RELEASE_ZIP_FILE_FOLDER+file_name)
                except Exception as e:
                    logger.logError("os.remove:"+str(e))
            else:
                try:
                    shutil.rmtree(Constant.PRE_RELEASE_ZIP_FILE_FOLDER+file_name)
                    logger.logCritical("shutil.rmtree -> file_name -> " +Constant.PRE_RELEASE_ZIP_FILE_FOLDER+file_name)
                except Exception as e:
                    logger.logError("shutil.rmtree:"+str(e))

            folder_list_array.remove(file_name)  

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM