dockerfile创建器
使用Haskell和嵌入式DSL构建Dockerfiles。
打印精美的文件
导入语言。码头工人main=做右d<-parseFile“./Dockerfile”putStr(prettyPrint d)
用Haskell编写Dockerfiles
{-#LANGUAGE重载字符串#-}{-#LANGUAGE重载列表#-}导入语言。码头工人main=putDockerfileStr$do来自“节点”运行“apt-get update”运行[“apt-get”,“install”,“something”]-- ...
使用QuasiQuoter
{-#LANGUAGE重载字符串#-}{-#LANGUAGE准引号#-}导入语言。码头工人main=putDockerfileStr$do来自“节点”运行“apt-get update”[电子文档|RUN获取更新CMD节点something.js|]-- ...
在Haskell中模板化Dockerfiles
{-#语言灵活上下文#-}{-#LANGUAGE重载字符串#-}{-#LANGUAGE重载列表#-}进口管制。莫纳德导入语言。码头工人导入数据。字符串(fromString)导入合格数据。文本。懒惰。IO作为Ltags=[“7.8”,“7.10”,“8”]cabalSandboxBuild包名称=dolet cabalFile=packageName++“.cabal”运行“cabal sandbox init”运行“cabal update”添加[fromString cabalFile](fromString$“/app/”++cabalFile)运行“cabal install--only dep-j”添加“.”“/app/”运行“阴谋集团构建”主要的=对于M_标记$\tag->do让df=toDockerfileText$do来自(“haskell”`tagged`tag)cabalSandbox构建“mypackage”L.writeFile(“./examples/templating-”++标记++“.dockerfile”)df
在DSL中使用IO
默认情况下,DSL在身份
莫纳德。通过运行IO,我们可以支持更多功能,如文件globbing:
{-#LANGUAGE重载字符串#-}{-#LANGUAGE重载列表#-}导入语言。码头工人导入合格的系统。目录作为目录导入合格的系统。文件路径作为文件路径导入合格的系统。文件路径。作为Glob的Glob导入数据。列表。非空(来自列表)导入合格数据。文本。懒惰。IO作为Lmain=做str<-toDockerfileTextIO$dofs<-liftIO$docwd<-目录.getCurrentDirectoryfs<-Glob.Glob“./test/*.hs”let relativeFiles=映射(FilePath.makeRelative cwd)fsreturn(来自列表relativeFiles)来自“ubuntu”将$(toSources fs)`复制到`“/app/”L.putStr街道