lxc_template.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. package docker
  2. import (
  3. "text/template"
  4. )
  5. const LxcTemplate = `
  6. # hostname
  7. {{if .Config.Hostname}}
  8. lxc.utsname = {{.Config.Hostname}}
  9. {{else}}
  10. lxc.utsname = {{.Id}}
  11. {{end}}
  12. #lxc.aa_profile = unconfined
  13. # network configuration
  14. lxc.network.type = veth
  15. lxc.network.flags = up
  16. lxc.network.link = lxcbr0
  17. lxc.network.name = eth0
  18. lxc.network.mtu = 1500
  19. lxc.network.ipv4 = {{.NetworkSettings.IpAddress}}/{{.NetworkSettings.IpPrefixLen}}
  20. # root filesystem
  21. {{$ROOTFS := .Mountpoint.Root}}
  22. lxc.rootfs = {{$ROOTFS}}
  23. # use a dedicated pts for the container (and limit the number of pseudo terminal
  24. # available)
  25. lxc.pts = 1024
  26. # disable the main console
  27. lxc.console = none
  28. # no controlling tty at all
  29. lxc.tty = 1
  30. # no implicit access to devices
  31. lxc.cgroup.devices.deny = a
  32. # /dev/null and zero
  33. lxc.cgroup.devices.allow = c 1:3 rwm
  34. lxc.cgroup.devices.allow = c 1:5 rwm
  35. # consoles
  36. lxc.cgroup.devices.allow = c 5:1 rwm
  37. lxc.cgroup.devices.allow = c 5:0 rwm
  38. lxc.cgroup.devices.allow = c 4:0 rwm
  39. lxc.cgroup.devices.allow = c 4:1 rwm
  40. # /dev/urandom,/dev/random
  41. lxc.cgroup.devices.allow = c 1:9 rwm
  42. lxc.cgroup.devices.allow = c 1:8 rwm
  43. # /dev/pts/* - pts namespaces are "coming soon"
  44. lxc.cgroup.devices.allow = c 136:* rwm
  45. lxc.cgroup.devices.allow = c 5:2 rwm
  46. # tuntap
  47. lxc.cgroup.devices.allow = c 10:200 rwm
  48. # fuse
  49. #lxc.cgroup.devices.allow = c 10:229 rwm
  50. # rtc
  51. #lxc.cgroup.devices.allow = c 254:0 rwm
  52. # standard mount point
  53. lxc.mount.entry = proc {{$ROOTFS}}/proc proc nosuid,nodev,noexec 0 0
  54. lxc.mount.entry = sysfs {{$ROOTFS}}/sys sysfs nosuid,nodev,noexec 0 0
  55. lxc.mount.entry = devpts {{$ROOTFS}}/dev/pts devpts newinstance,ptmxmode=0666,nosuid,noexec 0 0
  56. #lxc.mount.entry = varrun {{$ROOTFS}}/var/run tmpfs mode=755,size=4096k,nosuid,nodev,noexec 0 0
  57. #lxc.mount.entry = varlock {{$ROOTFS}}/var/lock tmpfs size=1024k,nosuid,nodev,noexec 0 0
  58. #lxc.mount.entry = shm {{$ROOTFS}}/dev/shm tmpfs size=65536k,nosuid,nodev,noexec 0 0
  59. # Inject docker-init
  60. lxc.mount.entry = {{.SysInitPath}} {{$ROOTFS}}/sbin/init none bind,ro 0 0
  61. # In order to get a working DNS environment, mount bind (ro) the host's /etc/resolv.conf into the container
  62. lxc.mount.entry = /etc/resolv.conf {{$ROOTFS}}/etc/resolv.conf none bind,ro 0 0
  63. # drop linux capabilities (apply mainly to the user root in the container)
  64. lxc.cap.drop = audit_control audit_write mac_admin mac_override mknod net_raw setfcap setpcap sys_admin sys_boot sys_module sys_nice sys_pacct sys_rawio sys_resource sys_time sys_tty_config
  65. # limits
  66. {{if .Config.Memory}}
  67. lxc.cgroup.memory.limit_in_bytes = {{.Config.Memory}}
  68. lxc.cgroup.memory.soft_limit_in_bytes = {{.Config.Memory}}
  69. {{with $memSwap := getMemorySwap .Config}}
  70. lxc.cgroup.memory.memsw.limit_in_bytes = {{$memSwap}}
  71. {{end}}
  72. {{end}}
  73. `
  74. var LxcTemplateCompiled *template.Template
  75. func getMemorySwap(config *Config) int64 {
  76. // By default, MemorySwap is set to twice the size of RAM.
  77. // If you want to omit MemorySwap, set it to `-1'.
  78. if config.MemorySwap < 0 {
  79. return 0
  80. }
  81. return config.Memory * 2
  82. }
  83. func init() {
  84. var err error
  85. funcMap := template.FuncMap{
  86. "getMemorySwap": getMemorySwap,
  87. }
  88. LxcTemplateCompiled, err = template.New("lxc").Funcs(funcMap).Parse(LxcTemplate)
  89. if err != nil {
  90. panic(err)
  91. }
  92. }