diff --git a/fn/common.go b/fn/common.go index 583628e5b..ee91b1a77 100644 --- a/fn/common.go +++ b/fn/common.go @@ -232,7 +232,7 @@ var acceptableFnRuntimes = map[string]string{ "node": "iron/node", "perl": "iron/perl", "php": "iron/php", - "python": "iron/python", + "python": "iron/python:2", "ruby": "iron/ruby", "scala": "iron/scala", } diff --git a/fn/init.go b/fn/init.go index 245022dc4..476295f30 100644 --- a/fn/init.go +++ b/fn/init.go @@ -26,6 +26,7 @@ var ( ".go": "go", ".js": "node", ".rb": "ruby", + ".py": "python", } fnInitRuntimes []string diff --git a/fn/langs/base.go b/fn/langs/base.go index 2f5685853..3edcb1c20 100644 --- a/fn/langs/base.go +++ b/fn/langs/base.go @@ -11,6 +11,8 @@ func GetLangHelper(lang string) (LangHelper, error) { return &NodeLangHelper{}, nil case "ruby": return &RubyLangHelper{}, nil + case "python": + return &PythonHelper{}, nil } return nil, fmt.Errorf("No language helper found for %v", lang) } diff --git a/fn/langs/python.go b/fn/langs/python.go new file mode 100644 index 000000000..9dce5aeed --- /dev/null +++ b/fn/langs/python.go @@ -0,0 +1,44 @@ +package langs + +import ( + "fmt" + "os" + "os/exec" + "strings" +) + +type PythonHelper struct { +} + +func (lh *PythonHelper) Entrypoint() string { + return "python2 func.py" +} + +func (lh *PythonHelper) HasPreBuild() bool { + return true +} + +// PreBuild for Go builds the binary so the final image can be as small as possible +func (lh *PythonHelper) PreBuild() error { + wd, err := os.Getwd() + if err != nil { + return err + } + + pbcmd := fmt.Sprintf("docker run --rm -v %s:/worker -w /worker iron/python:2-dev pip install -t packages -r requirements.txt", wd) + fmt.Println("Running prebuild command:", pbcmd) + parts := strings.Fields(pbcmd) + head := parts[0] + parts = parts[1:len(parts)] + cmd := exec.Command(head, parts...) + cmd.Stderr = os.Stderr + cmd.Stdout = os.Stdout + if err := cmd.Run(); err != nil { + return fmt.Errorf("error running docker build: %v", err) + } + return nil +} + +func (lh *PythonHelper) AfterBuild() error { + return nil +}