ソースを参照

Merge remote-tracking branch 'origin/96-dns_issue-fix'

Solomon Hykes 12 年 前
コミット
cdf90bb04b
3 ファイル変更33 行追加8 行削除
  1. 13 7
      container.go
  2. 1 1
      lxc_template.go
  3. 19 0
      runtime.go

+ 13 - 7
container.go

@@ -33,13 +33,14 @@ type Container struct {
 	network         *NetworkInterface
 	NetworkSettings *NetworkSettings
 
-	SysInitPath string
-	cmd         *exec.Cmd
-	stdout      *writeBroadcaster
-	stderr      *writeBroadcaster
-	stdin       io.ReadCloser
-	stdinPipe   io.WriteCloser
-
+	SysInitPath    string
+	ResolvConfPath string
+
+	cmd       *exec.Cmd
+	stdout    *writeBroadcaster
+	stderr    *writeBroadcaster
+	stdin     io.ReadCloser
+	stdinPipe io.WriteCloser
 	ptyMaster io.Closer
 
 	runtime *Runtime
@@ -61,6 +62,7 @@ type Config struct {
 	StdinOnce    bool // If true, close stdin after the 1 attached client disconnects.
 	Env          []string
 	Cmd          []string
+	Dns          []string
 	Image        string // Name of the image as it was passed by the operator (eg. could be symbolic)
 }
 
@@ -85,6 +87,9 @@ func ParseRun(args []string, stdout io.Writer) (*Config, error) {
 	var flEnv ListOpts
 	cmd.Var(&flEnv, "e", "Set environment variables")
 
+	var flDns ListOpts
+	cmd.Var(&flDns, "dns", "Set custom dns servers")
+
 	if err := cmd.Parse(args); err != nil {
 		return nil, err
 	}
@@ -122,6 +127,7 @@ func ParseRun(args []string, stdout io.Writer) (*Config, error) {
 		AttachStderr: flAttach.Get("stderr"),
 		Env:          flEnv,
 		Cmd:          runCmd,
+		Dns:          flDns,
 		Image:        image,
 	}
 	// When allocating stdin in attached mode, close stdin at client disconnect

+ 1 - 1
lxc_template.go

@@ -78,7 +78,7 @@ lxc.mount.entry = devpts {{$ROOTFS}}/dev/pts devpts newinstance,ptmxmode=0666,no
 lxc.mount.entry = {{.SysInitPath}} {{$ROOTFS}}/sbin/init none bind,ro 0 0
 
 # In order to get a working DNS environment, mount bind (ro) the host's /etc/resolv.conf into the container
-lxc.mount.entry = /etc/resolv.conf {{$ROOTFS}}/etc/resolv.conf none bind,ro 0 0
+lxc.mount.entry = {{.ResolvConfPath}} {{$ROOTFS}}/etc/resolv.conf none bind,ro 0 0
 
 
 # drop linux capabilities (apply mainly to the user root in the container)

+ 19 - 0
runtime.go

@@ -82,6 +82,7 @@ func (runtime *Runtime) Create(config *Config) (*Container, error) {
 	if config.Hostname == "" {
 		config.Hostname = id[:12]
 	}
+
 	container := &Container{
 		// FIXME: we should generate the ID here instead of receiving it as an argument
 		Id:              id,
@@ -100,6 +101,24 @@ func (runtime *Runtime) Create(config *Config) (*Container, error) {
 	if err := os.Mkdir(container.root, 0700); err != nil {
 		return nil, err
 	}
+
+	// If custom dns exists, then create a resolv.conf for the container
+	if len(config.Dns) > 0 {
+		container.ResolvConfPath = path.Join(container.root, "resolv.conf")
+		f, err := os.Create(container.ResolvConfPath)
+		if err != nil {
+			return nil, err
+		}
+		defer f.Close()
+		for _, dns := range config.Dns {
+			if _, err := f.Write([]byte("nameserver " + dns + "\n")); err != nil {
+				return nil, err
+			}
+		}
+	} else {
+		container.ResolvConfPath = "/etc/resolv.conf"
+	}
+
 	// Step 2: save the container json
 	if err := container.ToDisk(); err != nil {
 		return nil, err