Add podman static build

We’re now able to build a static podman binary based on a custom nix
derivation. This is integrated in cirrus as well, whereas a later target
would be to provide a self-contained static binary bundle which can be
installed on any Linux x64-bit system.

Fixes: https://github.com/containers/libpod/issues/1399

Signed-off-by: Sascha Grunert <sgrunert@suse.com>
This commit is contained in:
Sascha Grunert
2020-03-20 10:55:23 +01:00
parent 18b273b72b
commit c21258b70e
12 changed files with 147 additions and 1 deletions

View File

@ -820,6 +820,7 @@ success_task:
- "test_build_cache_images"
- "verify_test_built_images"
- "docs"
- "static_build"
# FIXME remove when all v2 tests pass
- "integration_test_temporary"
@ -835,3 +836,18 @@ success_task:
memory: 1
success_script: '/usr/local/bin/entrypoint.sh ./$SCRIPT_BASE/success.sh |& ${TIMESTAMP}'
static_build_task:
container:
image: quay.io/podman/nix-podman:1.0.0
cpu: 8
memory: 12
timeout_in: 20m
depends_on:
- "gating"
build_script:
- nix build -f nix
binaries_artifacts:
path: "result-bin/bin/podman"
on_failure:
failed_branch_script: '$CIRRUS_WORKING_DIR/$SCRIPT_BASE/notice_branch_failure.sh |& ${TIMESTAMP}'

1
.gitignore vendored
View File

@ -31,3 +31,4 @@ release.txt
/test/copyimg/copyimg
/test/goecho/goecho
.vscode*
result-bin

10
Containerfile-nix Normal file
View File

@ -0,0 +1,10 @@
# vim: set syntax=dockerfile:
FROM nixos/nix:latest
RUN apk add --no-cache bash git
COPY . /work
WORKDIR work/nix
RUN nix-build
WORKDIR /
RUN rm -rf work

View File

@ -74,7 +74,7 @@ LDFLAGS_PODMAN ?= \
-X $(LIBPOD)/define.buildInfo=$(BUILD_INFO) \
-X $(LIBPOD)/config._installPrefix=$(PREFIX) \
-X $(LIBPOD)/config._etcDir=$(ETCDIR) \
-extldflags "$(LDFLAGS)"
$(EXTRA_LDFLAGS)
#Update to LIBSECCOMP_COMMIT should reflect in Dockerfile too.
LIBSECCOMP_COMMIT := v2.3.3
# Rarely if ever should integration tests take more than 50min,
@ -217,6 +217,30 @@ bin/podman.cross.%: .gopathok
GOARCH="$${TARGET##*.}" \
$(GO_BUILD) -gcflags '$(GCFLAGS)' -asmflags '$(ASMFLAGS)' -ldflags '$(LDFLAGS_PODMAN)' -tags '$(BUILDTAGS_CROSS)' -o "$@" $(PROJECT)/cmd/podman
# Update nix/nixpkgs.json its latest master commit
.PHONY: nixpkgs
nixpkgs:
@nix run -f channel:nixpkgs-unstable nix-prefetch-git -c nix-prefetch-git \
--no-deepClone https://github.com/nixos/nixpkgs > nix/nixpkgs.json
NIX_IMAGE ?= quay.io/podman/nix-podman:1.0.0
# Build the nix image as base for static builds
.PHONY: nix-image
nix-image:
$(CONTAINER_RUNTIME) build -t $(NIX_IMAGE) -f Containerfile-nix .
# Build podman statically linked based on the default nix container image
.PHONY: build-static
build-static:
$(CONTAINER_RUNTIME) run \
--rm -it \
-v $(shell pwd):/work \
-w /work $(NIX_IMAGE) \
sh -c "nix build -f nix && \
mkdir -p bin && \
cp result-*bin/bin/podman bin/podman-static"
.PHONY: run-docker-py-tests
run-docker-py-tests:
$(eval testLogs=$(shell mktemp))

View File

@ -180,3 +180,9 @@ Podman offers a Varlink-based API for remote management of containers.
However, this API has been deprecated by the REST API.
Varlink support is in maintenance mode, and will be removed in a future release.
For more details, you can see [this blog](https://podman.io/blogs/2020/01/17/podman-new-api.html).
## Static Binary Builds
The Cirrus CI integration within this repository contains a `static_build` job
which produces a static Podman binary for testing purposes. Please note that
this binary is not officially supported with respect to feature-completeness
and functionality and should be only used for testing.

View File

@ -33,6 +33,7 @@ type HostInfo struct {
SwapFree int64 `json:"swapFree"`
SwapTotal int64 `json:"swapTotal"`
Uptime string `json:"uptime"`
Linkmode string `json:"linkmode"`
}
// SlirpInfo describes the slirp exectuable that

View File

@ -14,6 +14,7 @@ import (
"github.com/containers/buildah"
"github.com/containers/libpod/libpod/define"
"github.com/containers/libpod/libpod/linkmode"
"github.com/containers/libpod/pkg/cgroups"
registries2 "github.com/containers/libpod/pkg/registries"
"github.com/containers/libpod/pkg/rootless"
@ -86,6 +87,7 @@ func (r *Runtime) hostInfo() (*define.HostInfo, error) {
info := define.HostInfo{
Arch: runtime.GOARCH,
BuildahVersion: buildah.Version,
Linkmode: linkmode.Linkmode(),
CPUs: runtime.NumCPU(),
Distribution: hostDistributionInfo,
EventLogger: r.eventer.String(),

View File

@ -0,0 +1,8 @@
// +build !static
package linkmode
// Linkmode returns the linking mode (static/dynamic) for the build.
func Linkmode() string {
return "dynamic"
}

View File

@ -0,0 +1,8 @@
// +build static
package linkmode
// Linkmode returns the linking mode (static/dynamic) for the build.
func Linkmode() string {
return "static"
}

53
nix/default.nix Normal file
View File

@ -0,0 +1,53 @@
let
pkgs = import ./nixpkgs.nix {
config = {
packageOverrides = pkg: {
go_1_12 = pkg.go_1_14;
};
};
};
static = pkg: pkg.overrideAttrs(old: {
configureFlags = (old.configureFlags or []) ++
[ "--without-shared" "--disable-shared" ];
dontDisableStatic = true;
enableSharedExecutables = false;
enableStatic = true;
});
patchLvm2 = pkg: pkg.overrideAttrs(old: {
configureFlags = [
"--disable-cmdlib" "--disable-readline" "--disable-udev_rules"
"--disable-udev_sync" "--enable-pkgconfig" "--enable-static_link"
];
preConfigure = old.preConfigure + ''
substituteInPlace libdm/Makefile.in --replace \
SUBDIRS=dm-tools SUBDIRS=
substituteInPlace tools/Makefile.in --replace \
"TARGETS += lvm.static" ""
substituteInPlace tools/Makefile.in --replace \
"INSTALL_LVM_TARGETS += install_tools_static" ""
'';
postInstall = "";
});
self = {
podman-static = (pkgs.podman.overrideAttrs(old: {
name = "podman-static";
buildInputs = old.buildInputs ++ (with pkgs; [
(static pkgs.libassuan)
(static pkgs.libgpgerror)
git
glibc
glibc.static
]);
src = ./..;
EXTRA_LDFLAGS = ''-linkmode external -extldflags "-static -lm"'';
BUILDTAGS = ''static apparmor selinux seccomp systemd varlink containers_image_ostree_stub'';
})).override {
gpgme = (static pkgs.gpgme);
libseccomp = (static pkgs.libseccomp);
lvm2 = (patchLvm2 (static pkgs.lvm2));
};
};
in self

9
nix/nixpkgs.json Normal file
View File

@ -0,0 +1,9 @@
{
"url": "https://github.com/nixos/nixpkgs",
"rev": "a08d4f605bca62c282ce9955d5ddf7d824e89809",
"date": "2020-03-20T10:10:15+01:00",
"sha256": "1bniq08dlmrmrz4aga1cj0d7rqbaq9xapm5ar15wdv2c6431z2m8",
"fetchSubmodules": false,
"deepClone": false,
"leaveDotGit": false
}

8
nix/nixpkgs.nix Normal file
View File

@ -0,0 +1,8 @@
let
json = builtins.fromJSON (builtins.readFile ./nixpkgs.json);
nixpkgs = import (builtins.fetchTarball {
name = "nixos-unstable";
url = "${json.url}/archive/${json.rev}.tar.gz";
inherit (json) sha256;
});
in nixpkgs