Linux Ash Shell 脚本,用于检查是否安装了某些软件包并通过 docker 调用

问题描述

我正在尝试在运行 OpenWRT 的嵌入式 Linux 上运行 docker。

由于嵌入式 Linux 是“资源约束”,我不希望 Docker 安装已安装的软件包,因此我想使用 docker 调用自定义 shell 脚本:

public class PersistentContainer: NSPersistentCloudKitContainer {}

class PersistenceController {
    static let shared = PersistenceController()
    
    static var managedobjectModel: NSManagedobjectModel = {
        let bundle = Bundle(for: PersistenceController.self)
        
        guard let url = bundle.url(forResource: "xcdatamodeld",withExtension: "momd") else {
            fatalError("Failed to locate momd file for xcdatamodeld")
        }
        
        guard let model = NSManagedobjectModel(contentsOf: url) else {
            fatalError("Failed to load momd file for xcdatamodeld")
        }
        
        return model
    }()

    let container: PersistentContainer

    init(inMemory: Bool = false) {
        container = PersistentContainer(name: "xcdatamodeld",managedobjectModel: Self.managedobjectModel)
        
        if inMemory {
            container.persistentStoreDescriptions.first!.url = URL(fileURLWithPath: "/dev/null")
        }
        
        container.loadPersistentStores(completionHandler: { (storeDescription,error) in
            if let error = error as NSError? {
                fatalError("Unresolved error \(error),\(error.userInfo)")
            }
        })
    }
}

我想要一个类似的简单 if/else 结构。

我不断收到:

RUN $CMD_STRING = $(gcc)
RUN $CMD_OUTPUT=$(${CMD_STRING} -version) 

RUN if [[ ${CMD_OUTPUT} == *"not found"* ]]; echo ${CMD_STRING} "was NOT FOUND,Installing..." 
    opkg update
    opkg install gcc
fi

解决方法

我没有一些 OpenWRT 用于测试,但如果它只是一个“灰烬”和“docker”问题,这可能会奏效。我在 alpine 上测试过,因为它也有灰分(来自busybox)。

Dockerfile:

from alpine:latest

RUN ash -c "if ! gcc 2>/dev/null; then echo 'not found..'; echo 'installing..'; fi"

构建它:

docker build . 
Sending build context to Docker daemon  3.072kB
Step 1/2 : from alpine:latest
 ---> 389fef711851
Step 2/2 : RUN ash -c "if ! gcc 2>/dev/null; then echo 'not found..'; echo 'installing..'; fi"
 ---> Running in 2c47bee97dfc
not found...
installing.. 
Removing intermediate container 2c47bee97dfc
 ---> 35e698d1aea6
Successfully built 35e698d1aea6
,

您的第一个命令中有多余的空格,并且不应使用开头带有美元符号的变量名。我想您可能也不想用 $() 分配它,因为您还没有测试它是否存在。尝试运行命令以查看它是否存在也不是一个好方法。您可以查看是否安装了这样的程序:

if ! command -v gcc &> /dev/null; then
  opkg install gcc
fi

(这是 POSIX 兼容的,所以应该在 ash 中工作。)

您还可以运行 opkg list-installed 并检查输出(请参阅 the docs),这对于在您的 PATH 中不是可执行文件的包可能很有用。