Skip to content

Repository files navigation

Build StatusGo Report CardCoverage Status

What is containerflight?

Containerflight allows you to run arbitrary Linux applications, build scripts etc. in a defined and isolated environment in which the current user context is considered. A containerflight app is started like any other program on your computer. It is basically a single yaml file which describes the application, its environment and dependencies. Containerflight has zero dependencies. It only needs access to the Docker daemon.

Example for an app file to run scrapy (a high-level web crawling and web scraping framework) without installing or upgrading packages on your host system. If you store the following description on disk and make it executable, you can run scrapy as it has been installed on the host system (just enter ./scrapy ⏎).

#!/usr/local/bin/containerflight runimage:
base: docker://python:3.6.0dockerfile: | # install gcc RUN apt-get update && \ export DEBIAN_FRONTEND=noninteractive && \ apt-get install -y gcc && \ rm -rf /var/lib/apt/lists/***** # install scrapy==1.5.1 RUN pip install scrapy ENTRYPOINT [ "scrapy" ]

Getting started

  1. Download the containerflight binary from github (or build it from source). It is recommended to store it in your $PATH so that you can directly run containerflight apps. Don't forget to set the executable flag for the containerflight executable. The following snippet installs the latest stable release of containerflight for Linux into /usr/local/bin/.

    sudo curl -L https://github.com/tjeske/containerflight/releases/download/v0.3.0/containerflight_linux_amd64 -o /usr/local/bin/containerflight
    sudo chmod +x /usr/local/bin/containerflight
  2. Write an app yaml file for your application. At the moment, only Docker as the container runtime is supported.

App file

An application file (or app file) is a yaml file describing the environment and dependencies needed to run the application. The following app file shows all available parameters. You find examples of some popular applications in the examples/ folder.

#!/usr/local/bin/containerflight runcompatibility: 0.2.xname: MyApplicationversion: 1.0description: This is just an example.console: falsegui: trueimage:
base: "docker://ubuntu:18.04"dockerfile: | ${APT_INSTALL(gcc)} ENTRYPOINT [ "/usr/bin/gcc" ]runtime:
docker:
runargs: ["-v", "${HOME}:${HOME}"]

If the first line of an app file is #!<containerflight executable> run and if the executable flag is set, you can directly run the containerflight application like any other program.

Parameters like name, version and description can be used to describe the application. If Docker is used, these parameters are considered when assigning an image name etc.

The gui parameter must be set to true to give the application access to the host X server. Set the console parameter to false (default is true) when a TTY should not be allocated and stdin is kept closed.

Image

image:
base: docker://<docker image>dockerfile: | ...

Containerflight has an integrated Docker client which supports API 1.25 (implemented by Docker 19.03.6) and can directly talk to the Docker daemon. This makes it easier to run apps on a CI build-slave like Jenkins.

A Docker image serves as a basis (base) and can be extended by using the Dockerfile syntax. See https://docs.docker.com/engine/reference/builder/ for more information.

Runtime

runtime:
docker:
runargs: [...]

At the moment Docker is used as the container runtime. You can specify additional docker run ... arguments as a yaml array via runargs: [ .. ]. Type docker run --help for more information.

Compatibility

An app file can be linked to a specific containerflight version.

compatibility: "0.1.2"

enforces containerflight runtime version 0.1.2.

Containerflight versions follow the Semantic Versioning system, where a version string consists of MAJOR.MINOR.PATCH.

  • MAJOR version increase makes incompatible changes
  • MINOR version increase adds functionality in a backwards-compatible manner
  • PATCH version increase makes backwards-compatible bug fixes

Major version zero (0.y.z) is for initial development. Anything may change at any time. Upcoming versions >= 1.0.0 of containerflight are always compatible until the MAJOR version won't be changed. If you are using containerflight 1.1.0 you can express compatibility with higher version of the containerflight runtime by

compatibility: ">=1.1.0 <2.0.0"

Please have a look at https://github.com/blang/semver to describe more complex version ranges.

Parameters

You can use parameters in an app file to consider the current user context.

  • ${APP_FILE_DIR}: directory where the app file is located
  • ${USERNAME}: current user name
  • ${USERID}: ID of the current user
  • ${GROUPNAME}: primary group of the current user
  • ${GROUPID}: primary group ID of the current user
  • ${HOME}: current user's home directory
  • ${PWD}: current working directory
  • ${ENV(<envname>)}: value of an environment variable (e.g. ${ENV(http_proxy)})
  • ${APT_INSTALL(pkg1, pkg2, ...)}: run apt-getand install packages (e.g. ${APT_INSTALL(gcc, wget)})
  • ${ADD(source, target)}: load a text file and store its content in the image (e.g. ${ADD(${HOME}/.git-credentials, /root/.git-credentials)})

Why containerflight?

Container technology like Docker is great but is not primarily made for (desktop) applications. Applications need context.

A containerized application runs under its own user id but often needs to process external user data. If the container adds new files and stores them externally, the files are owned by the container user and not by the external user.

With containerflight you can easily describe containers which consider their current environment. Processes in the container get the user id of the external user id. Environment variables are evaluated during container creation e.g. to respect proxy settings etc.

Link tools with your source code

I have often faced the problem that tools like compilers, development IDEs etc. should be part of a source code commit. New team members should start as soon as possible without wasting time while setting-up the (development) environment or running into troubles by using unsupported tools.

Tools like Vagrant and a bunch of bootstrap scripts can solve this problem. The problem is that a whole virtual machine for development is often too heavyweight (especially if you are working on several projects in parallel).

With containerflight you can describe each tool as a single yaml file and put them in your source code repository. Running and switching between such programs becomes a no-brainer.

Use and test new software

Using the latest version of a software can become a challenge. In general I prefer a stable Linux base system (LTS version of Ubuntu etc.) over a more unstable system with bleeding-edge software but sometimes I need a newer version of an application. The problems start to begin if the applications depend on a newer version of the system base libraries (e.g. GTK). Upgrading such libraries means upgrading the whole distribution, which is not an option.

Containerflight makes it easy to run such applications with its own library dependencies separately from the base system.

Build

  1. Install Go >= 1.13
  2. Build: go build or go build -a -ldflags '-extldflags "-static" -s' (static linking, not supported by OS X)

Contributing

  1. Fork it
  2. Download your fork to your PC (git clone https://github.com/your_username/containerflight && cd containerflight)
  3. Create your feature branch (git checkout -b my-new-feature)
  4. Make changes and add them (git add .)
  5. Commit your changes (git commit -m 'Add some feature')
  6. Push to the branch (git push origin my-new-feature)
  7. Create new pull request

License

Containerflight is released under the Apache 2.0 license. See LICENSE

About

containerflight - run applications in a defined and isolated environment

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - tjeske/containerflight: containerflight - run applications in a defined and isolated environment · GitHub
Skip to content

Repository files navigation

Build StatusGo Report CardCoverage Status

What is containerflight?

Containerflight allows you to run arbitrary Linux applications, build scripts etc. in a defined and isolated environment in which the current user context is considered. A containerflight app is started like any other program on your computer. It is basically a single yaml file which describes the application, its environment and dependencies. Containerflight has zero dependencies. It only needs access to the Docker daemon.

Example for an app file to run scrapy (a high-level web crawling and web scraping framework) without installing or upgrading packages on your host system. If you store the following description on disk and make it executable, you can run scrapy as it has been installed on the host system (just enter ./scrapy ⏎).

#!/usr/local/bin/containerflight runimage:
base: docker://python:3.6.0dockerfile: | # install gcc RUN apt-get update && \ export DEBIAN_FRONTEND=noninteractive && \ apt-get install -y gcc && \ rm -rf /var/lib/apt/lists/***** # install scrapy==1.5.1 RUN pip install scrapy ENTRYPOINT [ "scrapy" ]

Getting started

  1. Download the containerflight binary from github (or build it from source). It is recommended to store it in your $PATH so that you can directly run containerflight apps. Don't forget to set the executable flag for the containerflight executable. The following snippet installs the latest stable release of containerflight for Linux into /usr/local/bin/.

    sudo curl -L https://github.com/tjeske/containerflight/releases/download/v0.3.0/containerflight_linux_amd64 -o /usr/local/bin/containerflight
    sudo chmod +x /usr/local/bin/containerflight
  2. Write an app yaml file for your application. At the moment, only Docker as the container runtime is supported.

App file

An application file (or app file) is a yaml file describing the environment and dependencies needed to run the application. The following app file shows all available parameters. You find examples of some popular applications in the examples/ folder.

#!/usr/local/bin/containerflight runcompatibility: 0.2.xname: MyApplicationversion: 1.0description: This is just an example.console: falsegui: trueimage:
base: "docker://ubuntu:18.04"dockerfile: | ${APT_INSTALL(gcc)} ENTRYPOINT [ "/usr/bin/gcc" ]runtime:
docker:
runargs: ["-v", "${HOME}:${HOME}"]

If the first line of an app file is #!<containerflight executable> run and if the executable flag is set, you can directly run the containerflight application like any other program.

Parameters like name, version and description can be used to describe the application. If Docker is used, these parameters are considered when assigning an image name etc.

The gui parameter must be set to true to give the application access to the host X server. Set the console parameter to false (default is true) when a TTY should not be allocated and stdin is kept closed.

Image

image:
base: docker://<docker image>dockerfile: | ...

Containerflight has an integrated Docker client which supports API 1.25 (implemented by Docker 19.03.6) and can directly talk to the Docker daemon. This makes it easier to run apps on a CI build-slave like Jenkins.

A Docker image serves as a basis (base) and can be extended by using the Dockerfile syntax. See https://docs.docker.com/engine/reference/builder/ for more information.

Runtime

runtime:
docker:
runargs: [...]

At the moment Docker is used as the container runtime. You can specify additional docker run ... arguments as a yaml array via runargs: [ .. ]. Type docker run --help for more information.

Compatibility

An app file can be linked to a specific containerflight version.

compatibility: "0.1.2"

enforces containerflight runtime version 0.1.2.

Containerflight versions follow the Semantic Versioning system, where a version string consists of MAJOR.MINOR.PATCH.

  • MAJOR version increase makes incompatible changes
  • MINOR version increase adds functionality in a backwards-compatible manner
  • PATCH version increase makes backwards-compatible bug fixes

Major version zero (0.y.z) is for initial development. Anything may change at any time. Upcoming versions >= 1.0.0 of containerflight are always compatible until the MAJOR version won't be changed. If you are using containerflight 1.1.0 you can express compatibility with higher version of the containerflight runtime by

compatibility: ">=1.1.0 <2.0.0"

Please have a look at https://github.com/blang/semver to describe more complex version ranges.

Parameters

You can use parameters in an app file to consider the current user context.

  • ${APP_FILE_DIR}: directory where the app file is located
  • ${USERNAME}: current user name
  • ${USERID}: ID of the current user
  • ${GROUPNAME}: primary group of the current user
  • ${GROUPID}: primary group ID of the current user
  • ${HOME}: current user's home directory
  • ${PWD}: current working directory
  • ${ENV(<envname>)}: value of an environment variable (e.g. ${ENV(http_proxy)})
  • ${APT_INSTALL(pkg1, pkg2, ...)}: run apt-getand install packages (e.g. ${APT_INSTALL(gcc, wget)})
  • ${ADD(source, target)}: load a text file and store its content in the image (e.g. ${ADD(${HOME}/.git-credentials, /root/.git-credentials)})

Why containerflight?

Container technology like Docker is great but is not primarily made for (desktop) applications. Applications need context.

A containerized application runs under its own user id but often needs to process external user data. If the container adds new files and stores them externally, the files are owned by the container user and not by the external user.

With containerflight you can easily describe containers which consider their current environment. Processes in the container get the user id of the external user id. Environment variables are evaluated during container creation e.g. to respect proxy settings etc.

Link tools with your source code

I have often faced the problem that tools like compilers, development IDEs etc. should be part of a source code commit. New team members should start as soon as possible without wasting time while setting-up the (development) environment or running into troubles by using unsupported tools.

Tools like Vagrant and a bunch of bootstrap scripts can solve this problem. The problem is that a whole virtual machine for development is often too heavyweight (especially if you are working on several projects in parallel).

With containerflight you can describe each tool as a single yaml file and put them in your source code repository. Running and switching between such programs becomes a no-brainer.

Use and test new software

Using the latest version of a software can become a challenge. In general I prefer a stable Linux base system (LTS version of Ubuntu etc.) over a more unstable system with bleeding-edge software but sometimes I need a newer version of an application. The problems start to begin if the applications depend on a newer version of the system base libraries (e.g. GTK). Upgrading such libraries means upgrading the whole distribution, which is not an option.

Containerflight makes it easy to run such applications with its own library dependencies separately from the base system.

Build

  1. Install Go >= 1.13
  2. Build: go build or go build -a -ldflags '-extldflags "-static" -s' (static linking, not supported by OS X)

Contributing

  1. Fork it
  2. Download your fork to your PC (git clone https://github.com/your_username/containerflight && cd containerflight)
  3. Create your feature branch (git checkout -b my-new-feature)
  4. Make changes and add them (git add .)
  5. Commit your changes (git commit -m 'Add some feature')
  6. Push to the branch (git push origin my-new-feature)
  7. Create new pull request

License

Containerflight is released under the Apache 2.0 license. See LICENSE

About

containerflight - run applications in a defined and isolated environment

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - tjeske/containerflight: containerflight - run applications in a defined and isolated environment · GitHub
Skip to content

Repository files navigation

Build StatusGo Report CardCoverage Status

What is containerflight?

Containerflight allows you to run arbitrary Linux applications, build scripts etc. in a defined and isolated environment in which the current user context is considered. A containerflight app is started like any other program on your computer. It is basically a single yaml file which describes the application, its environment and dependencies. Containerflight has zero dependencies. It only needs access to the Docker daemon.

Example for an app file to run scrapy (a high-level web crawling and web scraping framework) without installing or upgrading packages on your host system. If you store the following description on disk and make it executable, you can run scrapy as it has been installed on the host system (just enter ./scrapy ⏎).

#!/usr/local/bin/containerflight runimage:
base: docker://python:3.6.0dockerfile: | # install gcc RUN apt-get update && \ export DEBIAN_FRONTEND=noninteractive && \ apt-get install -y gcc && \ rm -rf /var/lib/apt/lists/***** # install scrapy==1.5.1 RUN pip install scrapy ENTRYPOINT [ "scrapy" ]

Getting started

  1. Download the containerflight binary from github (or build it from source). It is recommended to store it in your $PATH so that you can directly run containerflight apps. Don't forget to set the executable flag for the containerflight executable. The following snippet installs the latest stable release of containerflight for Linux into /usr/local/bin/.

    sudo curl -L https://github.com/tjeske/containerflight/releases/download/v0.3.0/containerflight_linux_amd64 -o /usr/local/bin/containerflight
    sudo chmod +x /usr/local/bin/containerflight
  2. Write an app yaml file for your application. At the moment, only Docker as the container runtime is supported.

App file

An application file (or app file) is a yaml file describing the environment and dependencies needed to run the application. The following app file shows all available parameters. You find examples of some popular applications in the examples/ folder.

#!/usr/local/bin/containerflight runcompatibility: 0.2.xname: MyApplicationversion: 1.0description: This is just an example.console: falsegui: trueimage:
base: "docker://ubuntu:18.04"dockerfile: | ${APT_INSTALL(gcc)} ENTRYPOINT [ "/usr/bin/gcc" ]runtime:
docker:
runargs: ["-v", "${HOME}:${HOME}"]

If the first line of an app file is #!<containerflight executable> run and if the executable flag is set, you can directly run the containerflight application like any other program.

Parameters like name, version and description can be used to describe the application. If Docker is used, these parameters are considered when assigning an image name etc.

The gui parameter must be set to true to give the application access to the host X server. Set the console parameter to false (default is true) when a TTY should not be allocated and stdin is kept closed.

Image

image:
base: docker://<docker image>dockerfile: | ...

Containerflight has an integrated Docker client which supports API 1.25 (implemented by Docker 19.03.6) and can directly talk to the Docker daemon. This makes it easier to run apps on a CI build-slave like Jenkins.

A Docker image serves as a basis (base) and can be extended by using the Dockerfile syntax. See https://docs.docker.com/engine/reference/builder/ for more information.

Runtime

runtime:
docker:
runargs: [...]

At the moment Docker is used as the container runtime. You can specify additional docker run ... arguments as a yaml array via runargs: [ .. ]. Type docker run --help for more information.

Compatibility

An app file can be linked to a specific containerflight version.

compatibility: "0.1.2"

enforces containerflight runtime version 0.1.2.

Containerflight versions follow the Semantic Versioning system, where a version string consists of MAJOR.MINOR.PATCH.

  • MAJOR version increase makes incompatible changes
  • MINOR version increase adds functionality in a backwards-compatible manner
  • PATCH version increase makes backwards-compatible bug fixes

Major version zero (0.y.z) is for initial development. Anything may change at any time. Upcoming versions >= 1.0.0 of containerflight are always compatible until the MAJOR version won't be changed. If you are using containerflight 1.1.0 you can express compatibility with higher version of the containerflight runtime by

compatibility: ">=1.1.0 <2.0.0"

Please have a look at https://github.com/blang/semver to describe more complex version ranges.

Parameters

You can use parameters in an app file to consider the current user context.

  • ${APP_FILE_DIR}: directory where the app file is located
  • ${USERNAME}: current user name
  • ${USERID}: ID of the current user
  • ${GROUPNAME}: primary group of the current user
  • ${GROUPID}: primary group ID of the current user
  • ${HOME}: current user's home directory
  • ${PWD}: current working directory
  • ${ENV(<envname>)}: value of an environment variable (e.g. ${ENV(http_proxy)})
  • ${APT_INSTALL(pkg1, pkg2, ...)}: run apt-getand install packages (e.g. ${APT_INSTALL(gcc, wget)})
  • ${ADD(source, target)}: load a text file and store its content in the image (e.g. ${ADD(${HOME}/.git-credentials, /root/.git-credentials)})

Why containerflight?

Container technology like Docker is great but is not primarily made for (desktop) applications. Applications need context.

A containerized application runs under its own user id but often needs to process external user data. If the container adds new files and stores them externally, the files are owned by the container user and not by the external user.

With containerflight you can easily describe containers which consider their current environment. Processes in the container get the user id of the external user id. Environment variables are evaluated during container creation e.g. to respect proxy settings etc.

Link tools with your source code

I have often faced the problem that tools like compilers, development IDEs etc. should be part of a source code commit. New team members should start as soon as possible without wasting time while setting-up the (development) environment or running into troubles by using unsupported tools.

Tools like Vagrant and a bunch of bootstrap scripts can solve this problem. The problem is that a whole virtual machine for development is often too heavyweight (especially if you are working on several projects in parallel).

With containerflight you can describe each tool as a single yaml file and put them in your source code repository. Running and switching between such programs becomes a no-brainer.

Use and test new software

Using the latest version of a software can become a challenge. In general I prefer a stable Linux base system (LTS version of Ubuntu etc.) over a more unstable system with bleeding-edge software but sometimes I need a newer version of an application. The problems start to begin if the applications depend on a newer version of the system base libraries (e.g. GTK). Upgrading such libraries means upgrading the whole distribution, which is not an option.

Containerflight makes it easy to run such applications with its own library dependencies separately from the base system.

Build

  1. Install Go >= 1.13
  2. Build: go build or go build -a -ldflags '-extldflags "-static" -s' (static linking, not supported by OS X)

Contributing

  1. Fork it
  2. Download your fork to your PC (git clone https://github.com/your_username/containerflight && cd containerflight)
  3. Create your feature branch (git checkout -b my-new-feature)
  4. Make changes and add them (git add .)
  5. Commit your changes (git commit -m 'Add some feature')
  6. Push to the branch (git push origin my-new-feature)
  7. Create new pull request

License

Containerflight is released under the Apache 2.0 license. See LICENSE

About

containerflight - run applications in a defined and isolated environment

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - tjeske/containerflight: containerflight - run applications in a defined and isolated environment · GitHub
Skip to content

Repository files navigation

Build StatusGo Report CardCoverage Status

What is containerflight?

Containerflight allows you to run arbitrary Linux applications, build scripts etc. in a defined and isolated environment in which the current user context is considered. A containerflight app is started like any other program on your computer. It is basically a single yaml file which describes the application, its environment and dependencies. Containerflight has zero dependencies. It only needs access to the Docker daemon.

Example for an app file to run scrapy (a high-level web crawling and web scraping framework) without installing or upgrading packages on your host system. If you store the following description on disk and make it executable, you can run scrapy as it has been installed on the host system (just enter ./scrapy ⏎).

#!/usr/local/bin/containerflight runimage:
base: docker://python:3.6.0dockerfile: | # install gcc RUN apt-get update && \ export DEBIAN_FRONTEND=noninteractive && \ apt-get install -y gcc && \ rm -rf /var/lib/apt/lists/***** # install scrapy==1.5.1 RUN pip install scrapy ENTRYPOINT [ "scrapy" ]

Getting started

  1. Download the containerflight binary from github (or build it from source). It is recommended to store it in your $PATH so that you can directly run containerflight apps. Don't forget to set the executable flag for the containerflight executable. The following snippet installs the latest stable release of containerflight for Linux into /usr/local/bin/.

    sudo curl -L https://github.com/tjeske/containerflight/releases/download/v0.3.0/containerflight_linux_amd64 -o /usr/local/bin/containerflight
    sudo chmod +x /usr/local/bin/containerflight
  2. Write an app yaml file for your application. At the moment, only Docker as the container runtime is supported.

App file

An application file (or app file) is a yaml file describing the environment and dependencies needed to run the application. The following app file shows all available parameters. You find examples of some popular applications in the examples/ folder.

#!/usr/local/bin/containerflight runcompatibility: 0.2.xname: MyApplicationversion: 1.0description: This is just an example.console: falsegui: trueimage:
base: "docker://ubuntu:18.04"dockerfile: | ${APT_INSTALL(gcc)} ENTRYPOINT [ "/usr/bin/gcc" ]runtime:
docker:
runargs: ["-v", "${HOME}:${HOME}"]

If the first line of an app file is #!<containerflight executable> run and if the executable flag is set, you can directly run the containerflight application like any other program.

Parameters like name, version and description can be used to describe the application. If Docker is used, these parameters are considered when assigning an image name etc.

The gui parameter must be set to true to give the application access to the host X server. Set the console parameter to false (default is true) when a TTY should not be allocated and stdin is kept closed.

Image

image:
base: docker://<docker image>dockerfile: | ...

Containerflight has an integrated Docker client which supports API 1.25 (implemented by Docker 19.03.6) and can directly talk to the Docker daemon. This makes it easier to run apps on a CI build-slave like Jenkins.

A Docker image serves as a basis (base) and can be extended by using the Dockerfile syntax. See https://docs.docker.com/engine/reference/builder/ for more information.

Runtime

runtime:
docker:
runargs: [...]

At the moment Docker is used as the container runtime. You can specify additional docker run ... arguments as a yaml array via runargs: [ .. ]. Type docker run --help for more information.

Compatibility

An app file can be linked to a specific containerflight version.

compatibility: "0.1.2"

enforces containerflight runtime version 0.1.2.

Containerflight versions follow the Semantic Versioning system, where a version string consists of MAJOR.MINOR.PATCH.

  • MAJOR version increase makes incompatible changes
  • MINOR version increase adds functionality in a backwards-compatible manner
  • PATCH version increase makes backwards-compatible bug fixes

Major version zero (0.y.z) is for initial development. Anything may change at any time. Upcoming versions >= 1.0.0 of containerflight are always compatible until the MAJOR version won't be changed. If you are using containerflight 1.1.0 you can express compatibility with higher version of the containerflight runtime by

compatibility: ">=1.1.0 <2.0.0"

Please have a look at https://github.com/blang/semver to describe more complex version ranges.

Parameters

You can use parameters in an app file to consider the current user context.

  • ${APP_FILE_DIR}: directory where the app file is located
  • ${USERNAME}: current user name
  • ${USERID}: ID of the current user
  • ${GROUPNAME}: primary group of the current user
  • ${GROUPID}: primary group ID of the current user
  • ${HOME}: current user's home directory
  • ${PWD}: current working directory
  • ${ENV(<envname>)}: value of an environment variable (e.g. ${ENV(http_proxy)})
  • ${APT_INSTALL(pkg1, pkg2, ...)}: run apt-getand install packages (e.g. ${APT_INSTALL(gcc, wget)})
  • ${ADD(source, target)}: load a text file and store its content in the image (e.g. ${ADD(${HOME}/.git-credentials, /root/.git-credentials)})

Why containerflight?

Container technology like Docker is great but is not primarily made for (desktop) applications. Applications need context.

A containerized application runs under its own user id but often needs to process external user data. If the container adds new files and stores them externally, the files are owned by the container user and not by the external user.

With containerflight you can easily describe containers which consider their current environment. Processes in the container get the user id of the external user id. Environment variables are evaluated during container creation e.g. to respect proxy settings etc.

Link tools with your source code

I have often faced the problem that tools like compilers, development IDEs etc. should be part of a source code commit. New team members should start as soon as possible without wasting time while setting-up the (development) environment or running into troubles by using unsupported tools.

Tools like Vagrant and a bunch of bootstrap scripts can solve this problem. The problem is that a whole virtual machine for development is often too heavyweight (especially if you are working on several projects in parallel).

With containerflight you can describe each tool as a single yaml file and put them in your source code repository. Running and switching between such programs becomes a no-brainer.

Use and test new software

Using the latest version of a software can become a challenge. In general I prefer a stable Linux base system (LTS version of Ubuntu etc.) over a more unstable system with bleeding-edge software but sometimes I need a newer version of an application. The problems start to begin if the applications depend on a newer version of the system base libraries (e.g. GTK). Upgrading such libraries means upgrading the whole distribution, which is not an option.

Containerflight makes it easy to run such applications with its own library dependencies separately from the base system.

Build

  1. Install Go >= 1.13
  2. Build: go build or go build -a -ldflags '-extldflags "-static" -s' (static linking, not supported by OS X)

Contributing

  1. Fork it
  2. Download your fork to your PC (git clone https://github.com/your_username/containerflight && cd containerflight)
  3. Create your feature branch (git checkout -b my-new-feature)
  4. Make changes and add them (git add .)
  5. Commit your changes (git commit -m 'Add some feature')
  6. Push to the branch (git push origin my-new-feature)
  7. Create new pull request

License

Containerflight is released under the Apache 2.0 license. See LICENSE

About

containerflight - run applications in a defined and isolated environment

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - tjeske/containerflight: containerflight - run applications in a defined and isolated environment · GitHub
Skip to content

Repository files navigation

Build StatusGo Report CardCoverage Status

What is containerflight?

Containerflight allows you to run arbitrary Linux applications, build scripts etc. in a defined and isolated environment in which the current user context is considered. A containerflight app is started like any other program on your computer. It is basically a single yaml file which describes the application, its environment and dependencies. Containerflight has zero dependencies. It only needs access to the Docker daemon.

Example for an app file to run scrapy (a high-level web crawling and web scraping framework) without installing or upgrading packages on your host system. If you store the following description on disk and make it executable, you can run scrapy as it has been installed on the host system (just enter ./scrapy ⏎).

#!/usr/local/bin/containerflight runimage:
base: docker://python:3.6.0dockerfile: | # install gcc RUN apt-get update && \ export DEBIAN_FRONTEND=noninteractive && \ apt-get install -y gcc && \ rm -rf /var/lib/apt/lists/***** # install scrapy==1.5.1 RUN pip install scrapy ENTRYPOINT [ "scrapy" ]

Getting started

  1. Download the containerflight binary from github (or build it from source). It is recommended to store it in your $PATH so that you can directly run containerflight apps. Don't forget to set the executable flag for the containerflight executable. The following snippet installs the latest stable release of containerflight for Linux into /usr/local/bin/.

    sudo curl -L https://github.com/tjeske/containerflight/releases/download/v0.3.0/containerflight_linux_amd64 -o /usr/local/bin/containerflight
    sudo chmod +x /usr/local/bin/containerflight
  2. Write an app yaml file for your application. At the moment, only Docker as the container runtime is supported.

App file

An application file (or app file) is a yaml file describing the environment and dependencies needed to run the application. The following app file shows all available parameters. You find examples of some popular applications in the examples/ folder.

#!/usr/local/bin/containerflight runcompatibility: 0.2.xname: MyApplicationversion: 1.0description: This is just an example.console: falsegui: trueimage:
base: "docker://ubuntu:18.04"dockerfile: | ${APT_INSTALL(gcc)} ENTRYPOINT [ "/usr/bin/gcc" ]runtime:
docker:
runargs: ["-v", "${HOME}:${HOME}"]

If the first line of an app file is #!<containerflight executable> run and if the executable flag is set, you can directly run the containerflight application like any other program.

Parameters like name, version and description can be used to describe the application. If Docker is used, these parameters are considered when assigning an image name etc.

The gui parameter must be set to true to give the application access to the host X server. Set the console parameter to false (default is true) when a TTY should not be allocated and stdin is kept closed.

Image

image:
base: docker://<docker image>dockerfile: | ...

Containerflight has an integrated Docker client which supports API 1.25 (implemented by Docker 19.03.6) and can directly talk to the Docker daemon. This makes it easier to run apps on a CI build-slave like Jenkins.

A Docker image serves as a basis (base) and can be extended by using the Dockerfile syntax. See https://docs.docker.com/engine/reference/builder/ for more information.

Runtime

runtime:
docker:
runargs: [...]

At the moment Docker is used as the container runtime. You can specify additional docker run ... arguments as a yaml array via runargs: [ .. ]. Type docker run --help for more information.

Compatibility

An app file can be linked to a specific containerflight version.

compatibility: "0.1.2"

enforces containerflight runtime version 0.1.2.

Containerflight versions follow the Semantic Versioning system, where a version string consists of MAJOR.MINOR.PATCH.

  • MAJOR version increase makes incompatible changes
  • MINOR version increase adds functionality in a backwards-compatible manner
  • PATCH version increase makes backwards-compatible bug fixes

Major version zero (0.y.z) is for initial development. Anything may change at any time. Upcoming versions >= 1.0.0 of containerflight are always compatible until the MAJOR version won't be changed. If you are using containerflight 1.1.0 you can express compatibility with higher version of the containerflight runtime by

compatibility: ">=1.1.0 <2.0.0"

Please have a look at https://github.com/blang/semver to describe more complex version ranges.

Parameters

You can use parameters in an app file to consider the current user context.

  • ${APP_FILE_DIR}: directory where the app file is located
  • ${USERNAME}: current user name
  • ${USERID}: ID of the current user
  • ${GROUPNAME}: primary group of the current user
  • ${GROUPID}: primary group ID of the current user
  • ${HOME}: current user's home directory
  • ${PWD}: current working directory
  • ${ENV(<envname>)}: value of an environment variable (e.g. ${ENV(http_proxy)})
  • ${APT_INSTALL(pkg1, pkg2, ...)}: run apt-getand install packages (e.g. ${APT_INSTALL(gcc, wget)})
  • ${ADD(source, target)}: load a text file and store its content in the image (e.g. ${ADD(${HOME}/.git-credentials, /root/.git-credentials)})

Why containerflight?

Container technology like Docker is great but is not primarily made for (desktop) applications. Applications need context.

A containerized application runs under its own user id but often needs to process external user data. If the container adds new files and stores them externally, the files are owned by the container user and not by the external user.

With containerflight you can easily describe containers which consider their current environment. Processes in the container get the user id of the external user id. Environment variables are evaluated during container creation e.g. to respect proxy settings etc.

Link tools with your source code

I have often faced the problem that tools like compilers, development IDEs etc. should be part of a source code commit. New team members should start as soon as possible without wasting time while setting-up the (development) environment or running into troubles by using unsupported tools.

Tools like Vagrant and a bunch of bootstrap scripts can solve this problem. The problem is that a whole virtual machine for development is often too heavyweight (especially if you are working on several projects in parallel).

With containerflight you can describe each tool as a single yaml file and put them in your source code repository. Running and switching between such programs becomes a no-brainer.

Use and test new software

Using the latest version of a software can become a challenge. In general I prefer a stable Linux base system (LTS version of Ubuntu etc.) over a more unstable system with bleeding-edge software but sometimes I need a newer version of an application. The problems start to begin if the applications depend on a newer version of the system base libraries (e.g. GTK). Upgrading such libraries means upgrading the whole distribution, which is not an option.

Containerflight makes it easy to run such applications with its own library dependencies separately from the base system.

Build

  1. Install Go >= 1.13
  2. Build: go build or go build -a -ldflags '-extldflags "-static" -s' (static linking, not supported by OS X)

Contributing

  1. Fork it
  2. Download your fork to your PC (git clone https://github.com/your_username/containerflight && cd containerflight)
  3. Create your feature branch (git checkout -b my-new-feature)
  4. Make changes and add them (git add .)
  5. Commit your changes (git commit -m 'Add some feature')
  6. Push to the branch (git push origin my-new-feature)
  7. Create new pull request

License

Containerflight is released under the Apache 2.0 license. See LICENSE

About

containerflight - run applications in a defined and isolated environment

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - tjeske/containerflight: containerflight - run applications in a defined and isolated environment · GitHub
Skip to content

Repository files navigation

Build StatusGo Report CardCoverage Status

What is containerflight?

Containerflight allows you to run arbitrary Linux applications, build scripts etc. in a defined and isolated environment in which the current user context is considered. A containerflight app is started like any other program on your computer. It is basically a single yaml file which describes the application, its environment and dependencies. Containerflight has zero dependencies. It only needs access to the Docker daemon.

Example for an app file to run scrapy (a high-level web crawling and web scraping framework) without installing or upgrading packages on your host system. If you store the following description on disk and make it executable, you can run scrapy as it has been installed on the host system (just enter ./scrapy ⏎).

#!/usr/local/bin/containerflight runimage:
base: docker://python:3.6.0dockerfile: | # install gcc RUN apt-get update && \ export DEBIAN_FRONTEND=noninteractive && \ apt-get install -y gcc && \ rm -rf /var/lib/apt/lists/***** # install scrapy==1.5.1 RUN pip install scrapy ENTRYPOINT [ "scrapy" ]

Getting started

  1. Download the containerflight binary from github (or build it from source). It is recommended to store it in your $PATH so that you can directly run containerflight apps. Don't forget to set the executable flag for the containerflight executable. The following snippet installs the latest stable release of containerflight for Linux into /usr/local/bin/.

    sudo curl -L https://github.com/tjeske/containerflight/releases/download/v0.3.0/containerflight_linux_amd64 -o /usr/local/bin/containerflight
    sudo chmod +x /usr/local/bin/containerflight
  2. Write an app yaml file for your application. At the moment, only Docker as the container runtime is supported.

App file

An application file (or app file) is a yaml file describing the environment and dependencies needed to run the application. The following app file shows all available parameters. You find examples of some popular applications in the examples/ folder.

#!/usr/local/bin/containerflight runcompatibility: 0.2.xname: MyApplicationversion: 1.0description: This is just an example.console: falsegui: trueimage:
base: "docker://ubuntu:18.04"dockerfile: | ${APT_INSTALL(gcc)} ENTRYPOINT [ "/usr/bin/gcc" ]runtime:
docker:
runargs: ["-v", "${HOME}:${HOME}"]

If the first line of an app file is #!<containerflight executable> run and if the executable flag is set, you can directly run the containerflight application like any other program.

Parameters like name, version and description can be used to describe the application. If Docker is used, these parameters are considered when assigning an image name etc.

The gui parameter must be set to true to give the application access to the host X server. Set the console parameter to false (default is true) when a TTY should not be allocated and stdin is kept closed.

Image

image:
base: docker://<docker image>dockerfile: | ...

Containerflight has an integrated Docker client which supports API 1.25 (implemented by Docker 19.03.6) and can directly talk to the Docker daemon. This makes it easier to run apps on a CI build-slave like Jenkins.

A Docker image serves as a basis (base) and can be extended by using the Dockerfile syntax. See https://docs.docker.com/engine/reference/builder/ for more information.

Runtime

runtime:
docker:
runargs: [...]

At the moment Docker is used as the container runtime. You can specify additional docker run ... arguments as a yaml array via runargs: [ .. ]. Type docker run --help for more information.

Compatibility

An app file can be linked to a specific containerflight version.

compatibility: "0.1.2"

enforces containerflight runtime version 0.1.2.

Containerflight versions follow the Semantic Versioning system, where a version string consists of MAJOR.MINOR.PATCH.

  • MAJOR version increase makes incompatible changes
  • MINOR version increase adds functionality in a backwards-compatible manner
  • PATCH version increase makes backwards-compatible bug fixes

Major version zero (0.y.z) is for initial development. Anything may change at any time. Upcoming versions >= 1.0.0 of containerflight are always compatible until the MAJOR version won't be changed. If you are using containerflight 1.1.0 you can express compatibility with higher version of the containerflight runtime by

compatibility: ">=1.1.0 <2.0.0"

Please have a look at https://github.com/blang/semver to describe more complex version ranges.

Parameters

You can use parameters in an app file to consider the current user context.

  • ${APP_FILE_DIR}: directory where the app file is located
  • ${USERNAME}: current user name
  • ${USERID}: ID of the current user
  • ${GROUPNAME}: primary group of the current user
  • ${GROUPID}: primary group ID of the current user
  • ${HOME}: current user's home directory
  • ${PWD}: current working directory
  • ${ENV(<envname>)}: value of an environment variable (e.g. ${ENV(http_proxy)})
  • ${APT_INSTALL(pkg1, pkg2, ...)}: run apt-getand install packages (e.g. ${APT_INSTALL(gcc, wget)})
  • ${ADD(source, target)}: load a text file and store its content in the image (e.g. ${ADD(${HOME}/.git-credentials, /root/.git-credentials)})

Why containerflight?

Container technology like Docker is great but is not primarily made for (desktop) applications. Applications need context.

A containerized application runs under its own user id but often needs to process external user data. If the container adds new files and stores them externally, the files are owned by the container user and not by the external user.

With containerflight you can easily describe containers which consider their current environment. Processes in the container get the user id of the external user id. Environment variables are evaluated during container creation e.g. to respect proxy settings etc.

Link tools with your source code

I have often faced the problem that tools like compilers, development IDEs etc. should be part of a source code commit. New team members should start as soon as possible without wasting time while setting-up the (development) environment or running into troubles by using unsupported tools.

Tools like Vagrant and a bunch of bootstrap scripts can solve this problem. The problem is that a whole virtual machine for development is often too heavyweight (especially if you are working on several projects in parallel).

With containerflight you can describe each tool as a single yaml file and put them in your source code repository. Running and switching between such programs becomes a no-brainer.

Use and test new software

Using the latest version of a software can become a challenge. In general I prefer a stable Linux base system (LTS version of Ubuntu etc.) over a more unstable system with bleeding-edge software but sometimes I need a newer version of an application. The problems start to begin if the applications depend on a newer version of the system base libraries (e.g. GTK). Upgrading such libraries means upgrading the whole distribution, which is not an option.

Containerflight makes it easy to run such applications with its own library dependencies separately from the base system.

Build

  1. Install Go >= 1.13
  2. Build: go build or go build -a -ldflags '-extldflags "-static" -s' (static linking, not supported by OS X)

Contributing

  1. Fork it
  2. Download your fork to your PC (git clone https://github.com/your_username/containerflight && cd containerflight)
  3. Create your feature branch (git checkout -b my-new-feature)
  4. Make changes and add them (git add .)
  5. Commit your changes (git commit -m 'Add some feature')
  6. Push to the branch (git push origin my-new-feature)
  7. Create new pull request

License

Containerflight is released under the Apache 2.0 license. See LICENSE

About

containerflight - run applications in a defined and isolated environment

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - tjeske/containerflight: containerflight - run applications in a defined and isolated environment · GitHub
Skip to content

Repository files navigation

Build StatusGo Report CardCoverage Status

What is containerflight?

Containerflight allows you to run arbitrary Linux applications, build scripts etc. in a defined and isolated environment in which the current user context is considered. A containerflight app is started like any other program on your computer. It is basically a single yaml file which describes the application, its environment and dependencies. Containerflight has zero dependencies. It only needs access to the Docker daemon.

Example for an app file to run scrapy (a high-level web crawling and web scraping framework) without installing or upgrading packages on your host system. If you store the following description on disk and make it executable, you can run scrapy as it has been installed on the host system (just enter ./scrapy ⏎).

#!/usr/local/bin/containerflight runimage:
base: docker://python:3.6.0dockerfile: | # install gcc RUN apt-get update && \ export DEBIAN_FRONTEND=noninteractive && \ apt-get install -y gcc && \ rm -rf /var/lib/apt/lists/***** # install scrapy==1.5.1 RUN pip install scrapy ENTRYPOINT [ "scrapy" ]

Getting started

  1. Download the containerflight binary from github (or build it from source). It is recommended to store it in your $PATH so that you can directly run containerflight apps. Don't forget to set the executable flag for the containerflight executable. The following snippet installs the latest stable release of containerflight for Linux into /usr/local/bin/.

    sudo curl -L https://github.com/tjeske/containerflight/releases/download/v0.3.0/containerflight_linux_amd64 -o /usr/local/bin/containerflight
    sudo chmod +x /usr/local/bin/containerflight
  2. Write an app yaml file for your application. At the moment, only Docker as the container runtime is supported.

App file

An application file (or app file) is a yaml file describing the environment and dependencies needed to run the application. The following app file shows all available parameters. You find examples of some popular applications in the examples/ folder.

#!/usr/local/bin/containerflight runcompatibility: 0.2.xname: MyApplicationversion: 1.0description: This is just an example.console: falsegui: trueimage:
base: "docker://ubuntu:18.04"dockerfile: | ${APT_INSTALL(gcc)} ENTRYPOINT [ "/usr/bin/gcc" ]runtime:
docker:
runargs: ["-v", "${HOME}:${HOME}"]

If the first line of an app file is #!<containerflight executable> run and if the executable flag is set, you can directly run the containerflight application like any other program.

Parameters like name, version and description can be used to describe the application. If Docker is used, these parameters are considered when assigning an image name etc.

The gui parameter must be set to true to give the application access to the host X server. Set the console parameter to false (default is true) when a TTY should not be allocated and stdin is kept closed.

Image

image:
base: docker://<docker image>dockerfile: | ...

Containerflight has an integrated Docker client which supports API 1.25 (implemented by Docker 19.03.6) and can directly talk to the Docker daemon. This makes it easier to run apps on a CI build-slave like Jenkins.

A Docker image serves as a basis (base) and can be extended by using the Dockerfile syntax. See https://docs.docker.com/engine/reference/builder/ for more information.

Runtime

runtime:
docker:
runargs: [...]

At the moment Docker is used as the container runtime. You can specify additional docker run ... arguments as a yaml array via runargs: [ .. ]. Type docker run --help for more information.

Compatibility

An app file can be linked to a specific containerflight version.

compatibility: "0.1.2"

enforces containerflight runtime version 0.1.2.

Containerflight versions follow the Semantic Versioning system, where a version string consists of MAJOR.MINOR.PATCH.

  • MAJOR version increase makes incompatible changes
  • MINOR version increase adds functionality in a backwards-compatible manner
  • PATCH version increase makes backwards-compatible bug fixes

Major version zero (0.y.z) is for initial development. Anything may change at any time. Upcoming versions >= 1.0.0 of containerflight are always compatible until the MAJOR version won't be changed. If you are using containerflight 1.1.0 you can express compatibility with higher version of the containerflight runtime by

compatibility: ">=1.1.0 <2.0.0"

Please have a look at https://github.com/blang/semver to describe more complex version ranges.

Parameters

You can use parameters in an app file to consider the current user context.

  • ${APP_FILE_DIR}: directory where the app file is located
  • ${USERNAME}: current user name
  • ${USERID}: ID of the current user
  • ${GROUPNAME}: primary group of the current user
  • ${GROUPID}: primary group ID of the current user
  • ${HOME}: current user's home directory
  • ${PWD}: current working directory
  • ${ENV(<envname>)}: value of an environment variable (e.g. ${ENV(http_proxy)})
  • ${APT_INSTALL(pkg1, pkg2, ...)}: run apt-getand install packages (e.g. ${APT_INSTALL(gcc, wget)})
  • ${ADD(source, target)}: load a text file and store its content in the image (e.g. ${ADD(${HOME}/.git-credentials, /root/.git-credentials)})

Why containerflight?

Container technology like Docker is great but is not primarily made for (desktop) applications. Applications need context.

A containerized application runs under its own user id but often needs to process external user data. If the container adds new files and stores them externally, the files are owned by the container user and not by the external user.

With containerflight you can easily describe containers which consider their current environment. Processes in the container get the user id of the external user id. Environment variables are evaluated during container creation e.g. to respect proxy settings etc.

Link tools with your source code

I have often faced the problem that tools like compilers, development IDEs etc. should be part of a source code commit. New team members should start as soon as possible without wasting time while setting-up the (development) environment or running into troubles by using unsupported tools.

Tools like Vagrant and a bunch of bootstrap scripts can solve this problem. The problem is that a whole virtual machine for development is often too heavyweight (especially if you are working on several projects in parallel).

With containerflight you can describe each tool as a single yaml file and put them in your source code repository. Running and switching between such programs becomes a no-brainer.

Use and test new software

Using the latest version of a software can become a challenge. In general I prefer a stable Linux base system (LTS version of Ubuntu etc.) over a more unstable system with bleeding-edge software but sometimes I need a newer version of an application. The problems start to begin if the applications depend on a newer version of the system base libraries (e.g. GTK). Upgrading such libraries means upgrading the whole distribution, which is not an option.

Containerflight makes it easy to run such applications with its own library dependencies separately from the base system.

Build

  1. Install Go >= 1.13
  2. Build: go build or go build -a -ldflags '-extldflags "-static" -s' (static linking, not supported by OS X)

Contributing

  1. Fork it
  2. Download your fork to your PC (git clone https://github.com/your_username/containerflight && cd containerflight)
  3. Create your feature branch (git checkout -b my-new-feature)
  4. Make changes and add them (git add .)
  5. Commit your changes (git commit -m 'Add some feature')
  6. Push to the branch (git push origin my-new-feature)
  7. Create new pull request

License

Containerflight is released under the Apache 2.0 license. See LICENSE

About

containerflight - run applications in a defined and isolated environment

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - tjeske/containerflight: containerflight - run applications in a defined and isolated environment · GitHub
Skip to content

Repository files navigation

Build StatusGo Report CardCoverage Status

What is containerflight?

Containerflight allows you to run arbitrary Linux applications, build scripts etc. in a defined and isolated environment in which the current user context is considered. A containerflight app is started like any other program on your computer. It is basically a single yaml file which describes the application, its environment and dependencies. Containerflight has zero dependencies. It only needs access to the Docker daemon.

Example for an app file to run scrapy (a high-level web crawling and web scraping framework) without installing or upgrading packages on your host system. If you store the following description on disk and make it executable, you can run scrapy as it has been installed on the host system (just enter ./scrapy ⏎).

#!/usr/local/bin/containerflight runimage:
base: docker://python:3.6.0dockerfile: | # install gcc RUN apt-get update && \ export DEBIAN_FRONTEND=noninteractive && \ apt-get install -y gcc && \ rm -rf /var/lib/apt/lists/***** # install scrapy==1.5.1 RUN pip install scrapy ENTRYPOINT [ "scrapy" ]

Getting started

  1. Download the containerflight binary from github (or build it from source). It is recommended to store it in your $PATH so that you can directly run containerflight apps. Don't forget to set the executable flag for the containerflight executable. The following snippet installs the latest stable release of containerflight for Linux into /usr/local/bin/.

    sudo curl -L https://github.com/tjeske/containerflight/releases/download/v0.3.0/containerflight_linux_amd64 -o /usr/local/bin/containerflight
    sudo chmod +x /usr/local/bin/containerflight
  2. Write an app yaml file for your application. At the moment, only Docker as the container runtime is supported.

App file

An application file (or app file) is a yaml file describing the environment and dependencies needed to run the application. The following app file shows all available parameters. You find examples of some popular applications in the examples/ folder.

#!/usr/local/bin/containerflight runcompatibility: 0.2.xname: MyApplicationversion: 1.0description: This is just an example.console: falsegui: trueimage:
base: "docker://ubuntu:18.04"dockerfile: | ${APT_INSTALL(gcc)} ENTRYPOINT [ "/usr/bin/gcc" ]runtime:
docker:
runargs: ["-v", "${HOME}:${HOME}"]

If the first line of an app file is #!<containerflight executable> run and if the executable flag is set, you can directly run the containerflight application like any other program.

Parameters like name, version and description can be used to describe the application. If Docker is used, these parameters are considered when assigning an image name etc.

The gui parameter must be set to true to give the application access to the host X server. Set the console parameter to false (default is true) when a TTY should not be allocated and stdin is kept closed.

Image

image:
base: docker://<docker image>dockerfile: | ...

Containerflight has an integrated Docker client which supports API 1.25 (implemented by Docker 19.03.6) and can directly talk to the Docker daemon. This makes it easier to run apps on a CI build-slave like Jenkins.

A Docker image serves as a basis (base) and can be extended by using the Dockerfile syntax. See https://docs.docker.com/engine/reference/builder/ for more information.

Runtime

runtime:
docker:
runargs: [...]

At the moment Docker is used as the container runtime. You can specify additional docker run ... arguments as a yaml array via runargs: [ .. ]. Type docker run --help for more information.

Compatibility

An app file can be linked to a specific containerflight version.

compatibility: "0.1.2"

enforces containerflight runtime version 0.1.2.

Containerflight versions follow the Semantic Versioning system, where a version string consists of MAJOR.MINOR.PATCH.

  • MAJOR version increase makes incompatible changes
  • MINOR version increase adds functionality in a backwards-compatible manner
  • PATCH version increase makes backwards-compatible bug fixes

Major version zero (0.y.z) is for initial development. Anything may change at any time. Upcoming versions >= 1.0.0 of containerflight are always compatible until the MAJOR version won't be changed. If you are using containerflight 1.1.0 you can express compatibility with higher version of the containerflight runtime by

compatibility: ">=1.1.0 <2.0.0"

Please have a look at https://github.com/blang/semver to describe more complex version ranges.

Parameters

You can use parameters in an app file to consider the current user context.

  • ${APP_FILE_DIR}: directory where the app file is located
  • ${USERNAME}: current user name
  • ${USERID}: ID of the current user
  • ${GROUPNAME}: primary group of the current user
  • ${GROUPID}: primary group ID of the current user
  • ${HOME}: current user's home directory
  • ${PWD}: current working directory
  • ${ENV(<envname>)}: value of an environment variable (e.g. ${ENV(http_proxy)})
  • ${APT_INSTALL(pkg1, pkg2, ...)}: run apt-getand install packages (e.g. ${APT_INSTALL(gcc, wget)})
  • ${ADD(source, target)}: load a text file and store its content in the image (e.g. ${ADD(${HOME}/.git-credentials, /root/.git-credentials)})

Why containerflight?

Container technology like Docker is great but is not primarily made for (desktop) applications. Applications need context.

A containerized application runs under its own user id but often needs to process external user data. If the container adds new files and stores them externally, the files are owned by the container user and not by the external user.

With containerflight you can easily describe containers which consider their current environment. Processes in the container get the user id of the external user id. Environment variables are evaluated during container creation e.g. to respect proxy settings etc.

Link tools with your source code

I have often faced the problem that tools like compilers, development IDEs etc. should be part of a source code commit. New team members should start as soon as possible without wasting time while setting-up the (development) environment or running into troubles by using unsupported tools.

Tools like Vagrant and a bunch of bootstrap scripts can solve this problem. The problem is that a whole virtual machine for development is often too heavyweight (especially if you are working on several projects in parallel).

With containerflight you can describe each tool as a single yaml file and put them in your source code repository. Running and switching between such programs becomes a no-brainer.

Use and test new software

Using the latest version of a software can become a challenge. In general I prefer a stable Linux base system (LTS version of Ubuntu etc.) over a more unstable system with bleeding-edge software but sometimes I need a newer version of an application. The problems start to begin if the applications depend on a newer version of the system base libraries (e.g. GTK). Upgrading such libraries means upgrading the whole distribution, which is not an option.

Containerflight makes it easy to run such applications with its own library dependencies separately from the base system.

Build

  1. Install Go >= 1.13
  2. Build: go build or go build -a -ldflags '-extldflags "-static" -s' (static linking, not supported by OS X)

Contributing

  1. Fork it
  2. Download your fork to your PC (git clone https://github.com/your_username/containerflight && cd containerflight)
  3. Create your feature branch (git checkout -b my-new-feature)
  4. Make changes and add them (git add .)
  5. Commit your changes (git commit -m 'Add some feature')
  6. Push to the branch (git push origin my-new-feature)
  7. Create new pull request

License

Containerflight is released under the Apache 2.0 license. See LICENSE

About

containerflight - run applications in a defined and isolated environment

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages