问题描述
我正在尝试在运行 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 中不是可执行文件的包可能很有用。