This is part of an effort to break apart the deprecated server/ package
Docker-DCO-1.1-Signed-off-by: Solomon Hykes <solomon@docker.com> (github: shykes)
| 1 | 1 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,86 @@ |
| 0 |
+package daemon |
|
| 1 |
+ |
|
| 2 |
+import ( |
|
| 3 |
+ "github.com/docker/docker/engine" |
|
| 4 |
+ "github.com/docker/docker/graph" |
|
| 5 |
+ "github.com/docker/docker/pkg/parsers" |
|
| 6 |
+ "github.com/docker/docker/runconfig" |
|
| 7 |
+) |
|
| 8 |
+ |
|
| 9 |
+func (daemon *Daemon) ContainerCreate(job *engine.Job) engine.Status {
|
|
| 10 |
+ var name string |
|
| 11 |
+ if len(job.Args) == 1 {
|
|
| 12 |
+ name = job.Args[0] |
|
| 13 |
+ } else if len(job.Args) > 1 {
|
|
| 14 |
+ return job.Errorf("Usage: %s", job.Name)
|
|
| 15 |
+ } |
|
| 16 |
+ config := runconfig.ContainerConfigFromJob(job) |
|
| 17 |
+ if config.Memory != 0 && config.Memory < 524288 {
|
|
| 18 |
+ return job.Errorf("Minimum memory limit allowed is 512k")
|
|
| 19 |
+ } |
|
| 20 |
+ if config.Memory > 0 && !daemon.SystemConfig().MemoryLimit {
|
|
| 21 |
+ job.Errorf("Your kernel does not support memory limit capabilities. Limitation discarded.\n")
|
|
| 22 |
+ config.Memory = 0 |
|
| 23 |
+ } |
|
| 24 |
+ if config.Memory > 0 && !daemon.SystemConfig().SwapLimit {
|
|
| 25 |
+ job.Errorf("Your kernel does not support swap limit capabilities. Limitation discarded.\n")
|
|
| 26 |
+ config.MemorySwap = -1 |
|
| 27 |
+ } |
|
| 28 |
+ container, buildWarnings, err := daemon.Create(config, name) |
|
| 29 |
+ if err != nil {
|
|
| 30 |
+ if daemon.Graph().IsNotExist(err) {
|
|
| 31 |
+ _, tag := parsers.ParseRepositoryTag(config.Image) |
|
| 32 |
+ if tag == "" {
|
|
| 33 |
+ tag = graph.DEFAULTTAG |
|
| 34 |
+ } |
|
| 35 |
+ return job.Errorf("No such image: %s (tag: %s)", config.Image, tag)
|
|
| 36 |
+ } |
|
| 37 |
+ return job.Error(err) |
|
| 38 |
+ } |
|
| 39 |
+ if !container.Config.NetworkDisabled && daemon.SystemConfig().IPv4ForwardingDisabled {
|
|
| 40 |
+ job.Errorf("IPv4 forwarding is disabled.\n")
|
|
| 41 |
+ } |
|
| 42 |
+ job.Eng.Job("log", "create", container.ID, daemon.Repositories().ImageName(container.Image)).Run()
|
|
| 43 |
+ // FIXME: this is necessary because daemon.Create might return a nil container |
|
| 44 |
+ // with a non-nil error. This should not happen! Once it's fixed we |
|
| 45 |
+ // can remove this workaround. |
|
| 46 |
+ if container != nil {
|
|
| 47 |
+ job.Printf("%s\n", container.ID)
|
|
| 48 |
+ } |
|
| 49 |
+ for _, warning := range buildWarnings {
|
|
| 50 |
+ job.Errorf("%s\n", warning)
|
|
| 51 |
+ } |
|
| 52 |
+ return engine.StatusOK |
|
| 53 |
+} |
|
| 54 |
+ |
|
| 55 |
+// Create creates a new container from the given configuration with a given name. |
|
| 56 |
+func (daemon *Daemon) Create(config *runconfig.Config, name string) (*Container, []string, error) {
|
|
| 57 |
+ var ( |
|
| 58 |
+ container *Container |
|
| 59 |
+ warnings []string |
|
| 60 |
+ ) |
|
| 61 |
+ |
|
| 62 |
+ img, err := daemon.repositories.LookupImage(config.Image) |
|
| 63 |
+ if err != nil {
|
|
| 64 |
+ return nil, nil, err |
|
| 65 |
+ } |
|
| 66 |
+ if err := daemon.checkImageDepth(img); err != nil {
|
|
| 67 |
+ return nil, nil, err |
|
| 68 |
+ } |
|
| 69 |
+ if warnings, err = daemon.mergeAndVerifyConfig(config, img); err != nil {
|
|
| 70 |
+ return nil, nil, err |
|
| 71 |
+ } |
|
| 72 |
+ if container, err = daemon.newContainer(name, config, img); err != nil {
|
|
| 73 |
+ return nil, nil, err |
|
| 74 |
+ } |
|
| 75 |
+ if err := daemon.createRootfs(container, img); err != nil {
|
|
| 76 |
+ return nil, nil, err |
|
| 77 |
+ } |
|
| 78 |
+ if err := container.ToDisk(); err != nil {
|
|
| 79 |
+ return nil, nil, err |
|
| 80 |
+ } |
|
| 81 |
+ if err := daemon.Register(container); err != nil {
|
|
| 82 |
+ return nil, nil, err |
|
| 83 |
+ } |
|
| 84 |
+ return container, warnings, nil |
|
| 85 |
+} |
| ... | ... |
@@ -123,6 +123,9 @@ func (daemon *Daemon) Install(eng *engine.Engine) error {
|
| 123 | 123 |
if err := eng.Register("export", daemon.ContainerExport); err != nil {
|
| 124 | 124 |
return err |
| 125 | 125 |
} |
| 126 |
+ if err := eng.Register("create", daemon.ContainerCreate); err != nil {
|
|
| 127 |
+ return err |
|
| 128 |
+ } |
|
| 126 | 129 |
return nil |
| 127 | 130 |
} |
| 128 | 131 |
|
| ... | ... |
@@ -403,38 +406,6 @@ func (daemon *Daemon) restore() error {
|
| 403 | 403 |
return nil |
| 404 | 404 |
} |
| 405 | 405 |
|
| 406 |
-// Create creates a new container from the given configuration with a given name. |
|
| 407 |
-func (daemon *Daemon) Create(config *runconfig.Config, name string) (*Container, []string, error) {
|
|
| 408 |
- var ( |
|
| 409 |
- container *Container |
|
| 410 |
- warnings []string |
|
| 411 |
- ) |
|
| 412 |
- |
|
| 413 |
- img, err := daemon.repositories.LookupImage(config.Image) |
|
| 414 |
- if err != nil {
|
|
| 415 |
- return nil, nil, err |
|
| 416 |
- } |
|
| 417 |
- if err := daemon.checkImageDepth(img); err != nil {
|
|
| 418 |
- return nil, nil, err |
|
| 419 |
- } |
|
| 420 |
- if warnings, err = daemon.mergeAndVerifyConfig(config, img); err != nil {
|
|
| 421 |
- return nil, nil, err |
|
| 422 |
- } |
|
| 423 |
- if container, err = daemon.newContainer(name, config, img); err != nil {
|
|
| 424 |
- return nil, nil, err |
|
| 425 |
- } |
|
| 426 |
- if err := daemon.createRootfs(container, img); err != nil {
|
|
| 427 |
- return nil, nil, err |
|
| 428 |
- } |
|
| 429 |
- if err := container.ToDisk(); err != nil {
|
|
| 430 |
- return nil, nil, err |
|
| 431 |
- } |
|
| 432 |
- if err := daemon.Register(container); err != nil {
|
|
| 433 |
- return nil, nil, err |
|
| 434 |
- } |
|
| 435 |
- return container, warnings, nil |
|
| 436 |
-} |
|
| 437 |
- |
|
| 438 | 406 |
func (daemon *Daemon) checkImageDepth(img *image.Image) error {
|
| 439 | 407 |
// We add 2 layers to the depth because the container's rw and |
| 440 | 408 |
// init layer add to the restriction |
| ... | ... |
@@ -21,9 +21,7 @@ import ( |
| 21 | 21 |
|
| 22 | 22 |
"github.com/docker/docker/daemon" |
| 23 | 23 |
"github.com/docker/docker/engine" |
| 24 |
- "github.com/docker/docker/graph" |
|
| 25 | 24 |
"github.com/docker/docker/pkg/graphdb" |
| 26 |
- "github.com/docker/docker/pkg/parsers" |
|
| 27 | 25 |
"github.com/docker/docker/pkg/tailfile" |
| 28 | 26 |
"github.com/docker/docker/runconfig" |
| 29 | 27 |
"github.com/docker/docker/utils" |
| ... | ... |
@@ -263,52 +261,6 @@ func (srv *Server) ContainerCommit(job *engine.Job) engine.Status {
|
| 263 | 263 |
return engine.StatusOK |
| 264 | 264 |
} |
| 265 | 265 |
|
| 266 |
-func (srv *Server) ContainerCreate(job *engine.Job) engine.Status {
|
|
| 267 |
- var name string |
|
| 268 |
- if len(job.Args) == 1 {
|
|
| 269 |
- name = job.Args[0] |
|
| 270 |
- } else if len(job.Args) > 1 {
|
|
| 271 |
- return job.Errorf("Usage: %s", job.Name)
|
|
| 272 |
- } |
|
| 273 |
- config := runconfig.ContainerConfigFromJob(job) |
|
| 274 |
- if config.Memory != 0 && config.Memory < 524288 {
|
|
| 275 |
- return job.Errorf("Minimum memory limit allowed is 512k")
|
|
| 276 |
- } |
|
| 277 |
- if config.Memory > 0 && !srv.daemon.SystemConfig().MemoryLimit {
|
|
| 278 |
- job.Errorf("Your kernel does not support memory limit capabilities. Limitation discarded.\n")
|
|
| 279 |
- config.Memory = 0 |
|
| 280 |
- } |
|
| 281 |
- if config.Memory > 0 && !srv.daemon.SystemConfig().SwapLimit {
|
|
| 282 |
- job.Errorf("Your kernel does not support swap limit capabilities. Limitation discarded.\n")
|
|
| 283 |
- config.MemorySwap = -1 |
|
| 284 |
- } |
|
| 285 |
- container, buildWarnings, err := srv.daemon.Create(config, name) |
|
| 286 |
- if err != nil {
|
|
| 287 |
- if srv.daemon.Graph().IsNotExist(err) {
|
|
| 288 |
- _, tag := parsers.ParseRepositoryTag(config.Image) |
|
| 289 |
- if tag == "" {
|
|
| 290 |
- tag = graph.DEFAULTTAG |
|
| 291 |
- } |
|
| 292 |
- return job.Errorf("No such image: %s (tag: %s)", config.Image, tag)
|
|
| 293 |
- } |
|
| 294 |
- return job.Error(err) |
|
| 295 |
- } |
|
| 296 |
- if !container.Config.NetworkDisabled && srv.daemon.SystemConfig().IPv4ForwardingDisabled {
|
|
| 297 |
- job.Errorf("IPv4 forwarding is disabled.\n")
|
|
| 298 |
- } |
|
| 299 |
- srv.LogEvent("create", container.ID, srv.daemon.Repositories().ImageName(container.Image))
|
|
| 300 |
- // FIXME: this is necessary because daemon.Create might return a nil container |
|
| 301 |
- // with a non-nil error. This should not happen! Once it's fixed we |
|
| 302 |
- // can remove this workaround. |
|
| 303 |
- if container != nil {
|
|
| 304 |
- job.Printf("%s\n", container.ID)
|
|
| 305 |
- } |
|
| 306 |
- for _, warning := range buildWarnings {
|
|
| 307 |
- job.Errorf("%s\n", warning)
|
|
| 308 |
- } |
|
| 309 |
- return engine.StatusOK |
|
| 310 |
-} |
|
| 311 |
- |
|
| 312 | 266 |
func (srv *Server) ContainerRestart(job *engine.Job) engine.Status {
|
| 313 | 267 |
if len(job.Args) != 1 {
|
| 314 | 268 |
return job.Errorf("Usage: %s CONTAINER\n", job.Name)
|
| ... | ... |
@@ -86,7 +86,6 @@ func InitServer(job *engine.Job) engine.Status {
|
| 86 | 86 |
job.Eng.Hack_SetGlobalVar("httpapi.daemon", srv.daemon)
|
| 87 | 87 |
|
| 88 | 88 |
for name, handler := range map[string]engine.Handler{
|
| 89 |
- "create": srv.ContainerCreate, |
|
| 90 | 89 |
"stop": srv.ContainerStop, |
| 91 | 90 |
"restart": srv.ContainerRestart, |
| 92 | 91 |
"start": srv.ContainerStart, |