Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/softwarefactory-project/dhall-containerfile
Manage your Containerfile with Dhall.
https://github.com/softwarefactory-project/dhall-containerfile
containerfile dhall dhall-lang
Last synced: 3 months ago
JSON representation
Manage your Containerfile with Dhall.
- Host: GitHub
- URL: https://github.com/softwarefactory-project/dhall-containerfile
- Owner: softwarefactory-project
- Created: 2020-07-30T20:52:48.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2021-10-26T14:28:18.000Z (about 3 years ago)
- Last Synced: 2024-06-11T00:12:20.910Z (5 months ago)
- Topics: containerfile, dhall, dhall-lang
- Language: Dhall
- Homepage: https://docs.softwarefactory-project.io/dhall-containerfile/
- Size: 188 KB
- Stars: 29
- Watchers: 9
- Forks: 5
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
- awesome-dhall - dhall-containerfile - Dhall types for Containerfile. (Libraries)
README
# dhall-containerfile
Manage your Containerfile with [Dhall][dhall-lang].
Main [documentation](https://docs.softwarefactory-project.io/dhall-containerfile/)
## Usage
The package provides convenient function to create the statements:
```dhall
-- ./examples/demo.dhall
let Containerfile = ../package.dhallin Containerfile.from "fedora"
# Containerfile.emptyLine
# Containerfile.run
"Install emacs"
[ "dnf update -y", "dnf install -y emacs-nox", "dnf clean all" ]
# Containerfile.volume [ "/data" ]
# Containerfile.label
( toMap
{ description = "a text editor"
, maintainer = "[email protected]"
}
)
# Containerfile.emptyLine
# Containerfile.entrypoint [ "emacs" ]```
```
# dhall text <<< '(./package.dhall).render ./examples/demo.dhall'
FROM fedora# Install emacs
RUN dnf update -y && dnf install -y emacs-nox && dnf clean allVOLUME ["/data"]
LABEL description="a text editor"
LABEL maintainer="[email protected]"ENTRYPOINT ["emacs"]
```
## Reference
The package implements the [Containerfile reference][ref] with these changes:
* `Exec` is the `RUN` exec form
* `Cmd` only supports the preferred exec form
* `Empty` denotes an empty lines
* `Add` only supports the list form without chown argument
* `Copy` only supports the list form without chown argument
* `Entrypoint` only supports the prefered exec form```dhall
-- ./Containerfile/Statement.dhall
{-|
Based on [Dockerfile format](https://docs.docker.com/engine/reference/builder/#format)
-}
let Prelude = ../Prelude.dhallin < From : Text
| Run : Text
| Cmd : List Text
| Exec : List Text
| Label : Prelude.Map.Type Text Text
| Expose : Text
| Env : Prelude.Map.Type Text Text
| Add : List Text
| Copy : List Text
| CopyFrom : { from : Text, files : List Text }
| Entrypoint : List Text
| Volume : List Text
| User : Text
| Workdir : Text
| Arg : Prelude.Map.Type Text Text
| Shell : List Text
| Comment : Text
| Empty
>
: Type```
## Example
A complete example to build an ffmpeg image with some options:
```dhall
-- ./examples/ffmpeg.dhall
let Containerfile = ../package.dhalllet FfmpegOption =
{ Type = { x264 : Bool, xcb : Bool }
, default = { x264 = True, xcb = True }
}let buildLib =
\(name : Text) ->
\(url : Text) ->
\(build-commands : List Text) ->
Containerfile.run
"${name}: ${Containerfile.concatSep " " build-commands}"
( [ "cd /usr/local/src"
, "git clone --depth 1 ${url}"
, "cd ${name}"
]
# build-commands
# [ "make", "make install" ]
)let make
: FfmpegOption.Type -> Containerfile.Type
= \(options : FfmpegOption.Type) ->
let build-reqs =
[ "autoconf"
, "automake"
, "cmake"
, "freetype-devel"
, "gcc"
, "gcc-c++"
, "git"
, "libtool"
, "make"
, "nasm"
, "pkgconfig"
, "zlib-devel"
, "numactl-devel"
]
# Containerfile.optionalTexts options.xcb [ "libxcb-devel" ]let runtime-reqs =
[ "numactl" ]
# Containerfile.optionalTexts options.xcb [ "libxcb" ]let x264-build =
Containerfile.optionalStatements
options.x264
( buildLib
"x264"
"https://code.videolan.org/videolan/x264.git"
[ "./configure --prefix=\"/usr/local\" --enable-static" ]
)let yasm-build =
buildLib
"yasm"
"git://github.com/yasm/yasm.git"
[ "autoreconf -fiv", "./configure --prefix=\"/usr/local\"" ]let ffmpeg-build =
buildLib
"ffmpeg"
"git://source.ffmpeg.org/ffmpeg"
[ Containerfile.concatSep
" "
( [ "PKG_CONFIG_PATH=\"/usr/local/lib/pkgconfig\""
, "./configure"
, "--prefix=\"/usr/local\""
, "--extra-cflags=\"-I/usr/local/include\""
, "--extra-ldflags=\"-L/usr/local/lib\""
, "--pkg-config-flags=\"--static\""
, "--enable-gpl"
, "--enable-nonfree"
]
# Containerfile.optionalTexts
options.x264
[ "--enable-libx264" ]
# Containerfile.optionalTexts
options.xcb
[ "--enable-libxcb" ]
)
]let bootstrap =
Containerfile.run
"Install build and runtime reqs"
[ "dnf install -y "
++ Containerfile.concatSep " " (build-reqs # runtime-reqs)
]let cleanup =
Containerfile.run
"Cleanup"
[ "rm -Rf /usr/local/src/*"
, "dnf clean all"
, "dnf erase -y " ++ Containerfile.concatSep " " build-reqs
]in Containerfile.from "fedora:latest"
# Containerfile.emptyLine
# bootstrap
# yasm-build
# x264-build
# ffmpeg-build
# cleanup
# Containerfile.entrypoint [ "/usr/local/bin/ffmpeg" ]in { Containerfile = Containerfile.render (make FfmpegOption.default)
, make
, buildLib
}```
```text
# dhall text <<< '(./examples/ffmpeg.dhall).Containerfile'
FROM fedora:latest# Install build and runtime reqs
RUN dnf install -y autoconf automake cmake freetype-devel gcc gcc-c++ git libtool make nasm pkgconfig zlib-devel numactl-devel libxcb-devel numactl libxcb# yasm: autoreconf -fiv ./configure --prefix="/usr/local"
RUN cd /usr/local/src && git clone --depth 1 git://github.com/yasm/yasm.git && cd yasm && autoreconf -fiv && ./configure --prefix="/usr/local" && make && make install# x264: ./configure --prefix="/usr/local" --enable-static
RUN cd /usr/local/src && git clone --depth 1 https://code.videolan.org/videolan/x264.git && cd x264 && ./configure --prefix="/usr/local" --enable-static && make && make install# ffmpeg: PKG_CONFIG_PATH="/usr/local/lib/pkgconfig" ./configure --prefix="/usr/local" --extra-cflags="-I/usr/local/include" --extra-ldflags="-L/usr/local/lib" --pkg-config-flags="--static" --enable-gpl --enable-nonfree --enable-libx264 --enable-libxcb
RUN cd /usr/local/src && git clone --depth 1 git://source.ffmpeg.org/ffmpeg && cd ffmpeg && PKG_CONFIG_PATH="/usr/local/lib/pkgconfig" ./configure --prefix="/usr/local" --extra-cflags="-I/usr/local/include" --extra-ldflags="-L/usr/local/lib" --pkg-config-flags="--static" --enable-gpl --enable-nonfree --enable-libx264 --enable-libxcb && make && make install# Cleanup
RUN rm -Rf /usr/local/src/* && dnf clean all && dnf erase -y autoconf automake cmake freetype-devel gcc gcc-c++ git libtool make nasm pkgconfig zlib-devel numactl-devel libxcb-develENTRYPOINT ["/usr/local/bin/ffmpeg"]
```
## Changes
Frozen package are available in the tag commit.
### 0.4.0
- Add `user` helper
### 0.3.0
- Initial release
[dhall-lang]: https://dhall-lang.org
[ref]: https://docs.docker.com/engine/reference/builder/