api_updateContainer.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package docker
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. "os"
  6. "github.com/azukaar/cosmos-server/src/utils"
  7. containerType "github.com/docker/docker/api/types/container"
  8. "github.com/docker/go-connections/nat"
  9. "github.com/docker/docker/api/types/mount"
  10. "github.com/gorilla/mux"
  11. )
  12. type ContainerForm struct {
  13. Image string `json:"image"`
  14. RestartPolicy string `json:"restartPolicy"`
  15. Env []string `json:"envVars"`
  16. Labels map[string]string `json:"labels"`
  17. PortBindings nat.PortMap `json:"portBindings"`
  18. Volumes []mount.Mount `json:"Volumes"`
  19. // we make this a int so that we can ignore 0
  20. Interactive int `json:"interactive"`
  21. NetworkMode string `json:"networkMode"`
  22. }
  23. func UpdateContainerRoute(w http.ResponseWriter, req *http.Request) {
  24. if utils.AdminOnly(w, req) != nil {
  25. return
  26. }
  27. utils.Log("UpdateContainer" + "Updating container")
  28. if req.Method == "POST" {
  29. errD := Connect()
  30. if errD != nil {
  31. utils.Error("UpdateContainer", errD)
  32. utils.HTTPError(w, "Internal server error: "+errD.Error(), http.StatusInternalServerError, "DS002")
  33. return
  34. }
  35. vars := mux.Vars(req)
  36. containerName := utils.SanitizeSafe(vars["containerId"])
  37. if os.Getenv("HOSTNAME") != "" && containerName == os.Getenv("HOSTNAME") {
  38. utils.Error("SecureContainerRoute - Container cannot update itself", nil)
  39. utils.HTTPError(w, "Container cannot update itself", http.StatusBadRequest, "DS003")
  40. return
  41. }
  42. container, err := DockerClient.ContainerInspect(DockerContext, containerName)
  43. if err != nil {
  44. utils.Error("UpdateContainer", err)
  45. utils.HTTPError(w, "Internal server error: "+err.Error(), http.StatusInternalServerError, "DS002")
  46. return
  47. }
  48. var form ContainerForm
  49. err = json.NewDecoder(req.Body).Decode(&form)
  50. if err != nil {
  51. utils.Error("UpdateContainer", err)
  52. utils.HTTPError(w, "Invalid JSON", http.StatusBadRequest, "DS003")
  53. return
  54. }
  55. // Update container settings
  56. if(form.Image != "") {
  57. container.Config.Image = form.Image
  58. }
  59. if(form.RestartPolicy != "") {
  60. container.HostConfig.RestartPolicy = containerType.RestartPolicy{Name: form.RestartPolicy}
  61. }
  62. if(form.Env != nil) {
  63. container.Config.Env = form.Env
  64. }
  65. if(form.Labels != nil) {
  66. container.Config.Labels = form.Labels
  67. }
  68. if(form.PortBindings != nil) {
  69. container.HostConfig.PortBindings = form.PortBindings
  70. container.Config.ExposedPorts = make(map[nat.Port]struct{})
  71. for port := range form.PortBindings {
  72. container.Config.ExposedPorts[port] = struct{}{}
  73. }
  74. }
  75. if(form.Volumes != nil) {
  76. container.HostConfig.Mounts = form.Volumes
  77. container.HostConfig.Binds = []string{}
  78. }
  79. if(form.Interactive != 0) {
  80. container.Config.Tty = form.Interactive == 2
  81. container.Config.OpenStdin = form.Interactive == 2
  82. }
  83. if(form.NetworkMode != "") {
  84. container.HostConfig.NetworkMode = containerType.NetworkMode(form.NetworkMode)
  85. }
  86. _, err = EditContainer(container.ID, container, false)
  87. if err != nil {
  88. utils.Error("UpdateContainer: EditContainer", err)
  89. utils.HTTPError(w, "Internal server error: "+err.Error(), http.StatusInternalServerError, "DS004")
  90. return
  91. }
  92. json.NewEncoder(w).Encode(map[string]interface{}{
  93. "status": "OK",
  94. })
  95. } else {
  96. utils.Error("UpdateContainer: Method not allowed " + req.Method, nil)
  97. utils.HTTPError(w, "Method not allowed", http.StatusMethodNotAllowed, "HTTP001")
  98. return
  99. }
  100. }