浏览代码

Add VOLUME instruction to buildfile

Michael Crosby 12 年之前
父节点
当前提交
eb9fef2c42
共有 4 个文件被更改,包括 40 次插入0 次删除
  1. 21 0
      buildfile.go
  2. 9 0
      buildfile_test.go
  3. 7 0
      docs/sources/use/builder.rst
  4. 3 0
      utils.go

+ 21 - 0
buildfile.go

@@ -173,6 +173,27 @@ func (b *buildFile) CmdEntrypoint(args string) error {
 	return nil
 	return nil
 }
 }
 
 
+func (b *buildFile) CmdVolume(args string) error {
+	if args == "" {
+		return fmt.Errorf("Volume cannot be empty")
+	}
+
+	var volume []string
+	if err := json.Unmarshal([]byte(args), &volume); err != nil {
+		volume = []string{args}
+	}
+	if b.config.Volumes == nil {
+		b.config.Volumes = NewPathOpts()
+	}
+	for _, v := range volume {
+		b.config.Volumes[v] = struct{}{}
+	}
+	if err := b.commit("", b.config.Cmd, fmt.Sprintf("VOLUME %s", args)); err != nil {
+		return err
+	}
+	return nil
+}
+
 func (b *buildFile) addRemote(container *Container, orig, dest string) error {
 func (b *buildFile) addRemote(container *Container, orig, dest string) error {
 	file, err := utils.Download(orig, ioutil.Discard)
 	file, err := utils.Download(orig, ioutil.Discard)
 	if err != nil {
 	if err != nil {

+ 9 - 0
buildfile_test.go

@@ -87,6 +87,15 @@ run    [ "$FOO" = "BAR" ]
 from %s
 from %s
 ENTRYPOINT /bin/echo
 ENTRYPOINT /bin/echo
 CMD Hello world
 CMD Hello world
+`,
+		nil,
+	},
+
+	{
+		`
+from docker-ut
+VOLUME /test
+CMD Hello world
 `,
 `,
 		nil,
 		nil,
 	},
 	},

+ 7 - 0
docs/sources/use/builder.rst

@@ -160,6 +160,13 @@ files and directories are created with mode 0700, uid and gid 0.
 
 
 The `ENTRYPOINT` instruction adds an entry command that will not be overwritten when arguments are passed to docker run, unlike the behavior of `CMD`.  This allows arguments to be passed to the entrypoint.  i.e. `docker run <image> -d` will pass the "-d" argument to the entrypoint.
 The `ENTRYPOINT` instruction adds an entry command that will not be overwritten when arguments are passed to docker run, unlike the behavior of `CMD`.  This allows arguments to be passed to the entrypoint.  i.e. `docker run <image> -d` will pass the "-d" argument to the entrypoint.
 
 
+2.9 VOLUME
+----------
+
+    ``VOLUME ["/data"]``
+
+The `VOLUME` instruction will add one or more new volumes to any container created from the image.
+
 3. Dockerfile Examples
 3. Dockerfile Examples
 ======================
 ======================
 
 

+ 3 - 0
utils.go

@@ -89,4 +89,7 @@ func MergeConfig(userConf, imageConf *Config) {
 	if userConf.Entrypoint == nil || len(userConf.Entrypoint) == 0 {
 	if userConf.Entrypoint == nil || len(userConf.Entrypoint) == 0 {
 		userConf.Entrypoint = imageConf.Entrypoint
 		userConf.Entrypoint = imageConf.Entrypoint
 	}
 	}
+	if userConf.Volumes == nil || len(userConf.Volumes) == 0 {
+		userConf.Volumes = imageConf.Volumes
+	}
 }
 }