diff --git a/cmd/cmd.go b/cmd/cmd.go
index 6091cd3d..d06f9e6f 100644
--- a/cmd/cmd.go
+++ b/cmd/cmd.go
@@ -119,11 +119,11 @@ type Commander interface {
 	VolumesUnmount(string, string, []string) error
 	ResourcesServices(int) error
 	ResourcesPlans(string, int) error
-	ResourcesCreate(string, string, string, []string) error
+	ResourcesCreate(string, string, string, []string, string) error
 	ResourcesList(string, int) error
 	ResourceDelete(string, string) error
 	ResourceGet(string, string) error
-	ResourcePut(string, string, string, []string) error
+	ResourcePut(string, string, string, []string, string) error
 	ResourceBind(string, string) error
 	ResourceUnbind(string, string) error
 }
diff --git a/cmd/resources.go b/cmd/resources.go
index 08f909b3..5b8066e2 100644
--- a/cmd/resources.go
+++ b/cmd/resources.go
@@ -1,12 +1,16 @@
 package cmd
 
 import (
+	"encoding/base64"
 	"fmt"
+	"io/ioutil"
+	"os"
 	"regexp"
 	"strconv"
 	"strings"
 
 	"github.com/olekukonko/tablewriter"
+	"sigs.k8s.io/yaml"
 
 	"github.com/drycc/controller-sdk-go/api"
 	"github.com/drycc/controller-sdk-go/resources"
@@ -73,16 +77,39 @@ func (d *DryccCmd) ResourcesPlans(serviceName string, results int) error {
 }
 
 // ResourcesCreate create a resource for the application
-func (d *DryccCmd) ResourcesCreate(appID, plan string, name string, params []string) error {
+func (d *DryccCmd) ResourcesCreate(appID, plan string, name string, params []string, values string) error {
 	s, appID, err := load(d.ConfigFile, appID)
 
 	if err != nil {
 		return err
 	}
+	if len(params) != 0 && len(values) != 0 {
+		params = nil
+	}
+	paramsMap := make(map[string]interface{})
+	if values != "" {
+		valueFile, err := os.Stat(values)
+		if err != nil {
+			return err
+		}
+		if valueFile.Size() == 0 {
+			return fmt.Errorf("%s is empty", values)
+		}
+		rawValues, err := ioutil.ReadFile(values)
+		if err != nil {
+			return err
+		}
+		parsed := make(map[string]interface{})
+		err = yaml.Unmarshal(rawValues, &parsed)
+		if err != nil {
+			return err
+		}
+		paramsMap["rawValues"] = base64.StdEncoding.EncodeToString([]byte(rawValues))
+	}
 
 	d.Printf("Creating %s to %s... ", name, appID)
 
-	paramsMap, err := parseParams(params)
+	paramsMap, err = parseParams(paramsMap, params)
 	if err != nil {
 		return err
 	}
@@ -171,16 +198,39 @@ func (d *DryccCmd) ResourceDelete(appID, name string) error {
 }
 
 // ResourcePut update a resource for the application
-func (d *DryccCmd) ResourcePut(appID, plan string, name string, params []string) error {
+func (d *DryccCmd) ResourcePut(appID, plan string, name string, params []string, values string) error {
 	s, appID, err := load(d.ConfigFile, appID)
 
 	if err != nil {
 		return err
 	}
+	if len(params) != 0 && len(values) != 0 {
+		params = nil
+	}
+	paramsMap := make(map[string]interface{})
+	if values != "" {
+		valueFile, err := os.Stat(values)
+		if err != nil {
+			return err
+		}
+		if valueFile.Size() == 0 {
+			return fmt.Errorf("%s is empty", values)
+		}
+		rawValues, err := ioutil.ReadFile(values)
+		if err != nil {
+			return err
+		}
+		parsed := make(map[string]interface{})
+		err = yaml.Unmarshal(rawValues, &parsed)
+		if err != nil {
+			return err
+		}
+		paramsMap["rawValues"] = base64.StdEncoding.EncodeToString([]byte(rawValues))
+	}
 
 	d.Printf("Updating %s to %s... ", name, appID)
 
-	paramsMap, err := parseParams(params)
+	paramsMap, err = parseParams(paramsMap, params)
 	if err != nil {
 		return err
 	}
@@ -329,8 +379,7 @@ func maxNum(tempArray ...int) int {
 }
 
 // parseParams transfer params to map
-func parseParams(params []string) (map[string]interface{}, error) {
-	paramsMap := make(map[string]interface{})
+func parseParams(paramsMap map[string]interface{}, params []string) (map[string]interface{}, error) {
 	regex := regexp.MustCompile(`^([A-z_]+[A-z0-9_]*[\.{1}[A-z0-9_]+]*)=([\s\S]*)$`)
 	for _, param := range params {
 		if regex.MatchString(param) {
diff --git a/cmd/resources_test.go b/cmd/resources_test.go
index d08d6dbc..ef83d896 100644
--- a/cmd/resources_test.go
+++ b/cmd/resources_test.go
@@ -99,7 +99,7 @@ func TestResourcesCreate(t *testing.T) {
 		w.Write([]byte("{}"))
 	})
 
-	err = cmdr.ResourcesCreate("example-go", "mysql:5.6", "mysql", nil)
+	err = cmdr.ResourcesCreate("example-go", "mysql:5.6", "mysql", nil, "")
 	assert.NoError(t, err)
 
 	assert.Equal(t, testutil.StripProgress(b.String()), "Creating mysql to example-go... done\n", "output")
@@ -231,7 +231,7 @@ func TestResourcePut(t *testing.T) {
 		w.Write([]byte("{}"))
 	})
 
-	err = cmdr.ResourcePut("example-go", "mysql:5.7", "mysql", []string{"para1.para2=v1"})
+	err = cmdr.ResourcePut("example-go", "mysql:5.7", "mysql", []string{"para1.para2=v1"}, "")
 	assert.NoError(t, err)
 
 	assert.Equal(t, testutil.StripProgress(b.String()), "Updating mysql to example-go... done\n", "output")
diff --git a/parser/resources.go b/parser/resources.go
index 21c04629..fb030680 100644
--- a/parser/resources.go
+++ b/parser/resources.go
@@ -123,7 +123,7 @@ Usage: drycc resources:create <plan> <name> [<param>=<value>...] [options]
 
 Arguments:
   <plan>
-    the resource's plan.
+    the resource's plan, pattern: <service_name>:<plan_name>.
   <name>
     this resource instance alias.
   <param>
@@ -134,6 +134,8 @@ Arguments:
 Options:
   -a --app=<app>
     the uniquely identifiable name for the application.
+  -f --values=<values_file>
+    specify values in a YAML file. If set, params will be discard.
 `
 
 	args, err := docopt.Parse(usage, argv, true, "", false, true)
@@ -143,10 +145,11 @@ Options:
 	}
 
 	app := safeGetValue(args, "--app")
+	values := safeGetValue(args, "--values")
 	plan := safeGetValue(args, "<plan>")
 	name := safeGetValue(args, "<name>")
 
-	return cmdr.ResourcesCreate(app, plan, name, args["<param>=<value>"].([]string))
+	return cmdr.ResourcesCreate(app, plan, name, args["<param>=<value>"].([]string), values)
 }
 
 func resourcesList(argv []string, cmdr cmd.Commander) error {
@@ -216,7 +219,7 @@ Usage: drycc resources:update <plan> <name> [<param>=<value>...] [options]
 
 Arguments:
   <plan>
-    the resource's plan.
+    the resource's plan, pattern: <service_name>:<plan_name>.
   <name>
     this resource instance alias.
   <param>
@@ -227,6 +230,8 @@ Arguments:
 Options:
   -a --app=<app>
     the uniquely identifiable name for the application.
+  -f --values=<values_file>
+	specify values in a YAML file. If set, params will be discard.
 `
 
 	args, err := docopt.Parse(usage, argv, true, "", false, true)
@@ -236,10 +241,11 @@ Options:
 	}
 
 	app := safeGetValue(args, "--app")
+	values := safeGetValue(args, "--values")
 	plan := safeGetValue(args, "<plan>")
 	name := safeGetValue(args, "<name>")
 
-	return cmdr.ResourcePut(app, plan, name, args["<param>=<value>"].([]string))
+	return cmdr.ResourcePut(app, plan, name, args["<param>=<value>"].([]string), values)
 }
 
 func resourceDelete(argv []string, cmdr cmd.Commander) error {
diff --git a/parser/resources_test.go b/parser/resources_test.go
index 50a5e91c..416a6fb5 100644
--- a/parser/resources_test.go
+++ b/parser/resources_test.go
@@ -20,7 +20,7 @@ func (d FakeDryccCmd) ResourcesPlans(string, int) error {
 	return errors.New("resources:plans")
 }
 
-func (d FakeDryccCmd) ResourcesCreate(string, string, string, []string) error {
+func (d FakeDryccCmd) ResourcesCreate(string, string, string, []string, string) error {
 	return errors.New("resources:create")
 }
 
@@ -32,7 +32,7 @@ func (d FakeDryccCmd) ResourceGet(string, string) error {
 	return errors.New("resources:describe")
 }
 
-func (d FakeDryccCmd) ResourcePut(string, string, string, []string) error {
+func (d FakeDryccCmd) ResourcePut(string, string, string, []string, string) error {
 	return errors.New("resources:update")
 }
 
