Make docker build on FreeBSD
@@ -1,4 +1,4 @@
-// +build linux
+// +build freebsd linux
package server
package builder
@@ -1,3 +1,5 @@
+// +build linux freebsd
+
package daemon
import (
-// +build !windows
-// +build exclude_graphdriver_aufs,linux
+// +build exclude_graphdriver_aufs,linux freebsd
-// +build !exclude_graphdriver_zfs,linux
+// +build !exclude_graphdriver_zfs,linux !exclude_graphdriver_zfs,freebsd
@@ -0,0 +1,9 @@
+// +build freebsd
+package daemon
+// checkExecSupport returns an error if the exec driver does not support exec,
+// or nil if it is supported.
+func checkExecSupport(drivername string) error {
+ return nil
+}
@@ -0,0 +1,19 @@
+package execdrivers
+import (
+ "fmt"
+ "github.com/docker/docker/daemon/execdriver"
+ "github.com/docker/docker/pkg/sysinfo"
+)
+// NewDriver returns a new execdriver.Driver from the given name configured with the provided options.
+func NewDriver(name string, options []string, root, libPath, initPath string, sysInfo *sysinfo.SysInfo) (execdriver.Driver, error) {
+ switch name {
+ case "jail":
+ return nil, fmt.Errorf("jail driver not yet supported on FreeBSD")
+ }
+ return nil, fmt.Errorf("unknown exec driver %s", name)
@@ -0,0 +1,8 @@
+package graphdriver
+var (
+ // Slice of drivers that should be used in an order
+ priority = []string{
+ "zfs",
-// +build !linux,!windows
+// +build !linux,!windows,!freebsd
package graphdriver
package zfs
@@ -0,0 +1,14 @@
+ "github.com/docker/docker/api/types"
+ "github.com/opencontainers/runc/libcontainer"
+// convertStatsToAPITypes converts the libcontainer.Stats to the api specific
+// structs. This is done to preserve API compatibility and versioning.
+func convertStatsToAPITypes(ls *libcontainer.Stats) *types.Stats {
+ // TODO FreeBSD. Refactor accordingly to fill in stats.
+ s := &types.Stats{}
+ return s
+ "github.com/docker/docker/runconfig"
+func mergeLxcConfIntoOptions(hostConfig *runconfig.HostConfig) ([]string, error) {
+ return nil, nil
@@ -0,0 +1,7 @@
+// +build daemon
+package main
+ _ "github.com/docker/docker/daemon/execdriver/lxc"
@@ -11,7 +11,6 @@ import (
"github.com/docker/docker/daemon"
"github.com/docker/docker/pkg/system"
- _ "github.com/docker/docker/daemon/execdriver/lxc"
_ "github.com/docker/docker/daemon/execdriver/native"
)
package directory
@@ -0,0 +1,18 @@
+package operatingsystem
+ "errors"
+// GetOperatingSystem gets the name of the current operating system.
+func GetOperatingSystem() (string, error) {
+ // TODO: Implement OS detection
+ return "", errors.New("Cannot detect OS version")
+// IsContainerized returns true if we are running inside a container.
+// No-op on FreeBSD, always returns false.
+func IsContainerized() (bool, error) {
+ // TODO: Implement jail detection
+ return false, errors.New("Cannot detect if we are in container")
@@ -0,0 +1,23 @@
+package reexec
+ "os/exec"
+// Self returns the path to the current process's binary.
+// Uses os.Args[0].
+func Self() string {
+ return naiveSelf()
+// Command returns *exec.Cmd which have Path as current binary.
+// For example if current binary is "docker" at "/usr/bin/", then cmd.Path will
+// be set to "/usr/bin/docker".
+func Command(args ...string) *exec.Cmd {
+ return &exec.Cmd{
+ Path: Self(),
+ Args: args,
package reexec
package sockets
+package sysinfo
+// TODO FreeBSD
+func New(quiet bool) *SysInfo {
+ sysInfo := &SysInfo{}
+ return sysInfo
@@ -0,0 +1,27 @@
+package system
+ "syscall"
+// fromStatT converts a syscall.Stat_t type to a system.Stat_t type
+func fromStatT(s *syscall.Stat_t) (*Stat_t, error) {
+ return &Stat_t{size: s.Size,
+ mode: uint32(s.Mode),
+ uid: s.Uid,
+ gid: s.Gid,
+ rdev: uint64(s.Rdev),
+ mtim: s.Mtimespec}, nil
+// Stat takes a path to a file and returns
+// a system.Stat_t type pertaining to that file.
+//
+// Throws an error if the file does not exist
+func Stat(path string) (*Stat_t, error) {
+ s := &syscall.Stat_t{}
+ if err := syscall.Stat(path, s); err != nil {
+ return nil, err
+ return fromStatT(s)
package system