// ENTRYPOINT /usr/sbin/nginx // // Set the entrypoint (which defaults to sh -c on linux, or cmd /S /C on Windows) to // /usr/sbin/nginx. Will accept the CMD as the arguments to /usr/sbin/nginx. // // Handles command processing similar to CMD and RUN, only b.Config.Entrypoint // is initialized at NewBuilder time instead of through argument parsing. // func entrypoint(b *builder, args []string, attributes map[string]bool, original string) error { if err := b.BuilderFlags.Parse(); err != nil { return err } parsed := handleJSONArgs(args, attributes) switch { case attributes["json"]: // ENTRYPOINT ["echo", "hi"] b.Config.Entrypoint = runconfig.NewEntrypoint(parsed...) case len(parsed) == 0: // ENTRYPOINT [] b.Config.Entrypoint = nil default: // ENTRYPOINT echo hi if runtime.GOOS != "windows" { b.Config.Entrypoint = runconfig.NewEntrypoint("/bin/sh", "-c", parsed[0]) } else { b.Config.Entrypoint = runconfig.NewEntrypoint("cmd", "/S /C", parsed[0]) } } // when setting the entrypoint if a CMD was not explicitly set then // set the command to nil if !b.cmdSet { b.Config.Cmd = nil } if err := b.commit("", b.Config.Cmd, fmt.Sprintf("ENTRYPOINT %q", b.Config.Entrypoint)); err != nil { return err } return nil }
func (d *Daemon) ContainerExecCreate(job *engine.Job) error { if len(job.Args) != 1 { return fmt.Errorf("Usage: %s [options] container command [args]", job.Name) } if strings.HasPrefix(d.execDriver.Name(), lxc.DriverName) { return lxc.ErrExec } var name = job.Args[0] container, err := d.getActiveContainer(name) if err != nil { return err } config, err := runconfig.ExecConfigFromJob(job) if err != nil { return err } cmd := runconfig.NewCommand(config.Cmd...) entrypoint, args := d.getEntrypointAndArgs(runconfig.NewEntrypoint(), cmd) processConfig := execdriver.ProcessConfig{ Tty: config.Tty, Entrypoint: entrypoint, Arguments: args, User: config.User, Privileged: config.Privileged, } execConfig := &execConfig{ ID: stringid.GenerateRandomID(), OpenStdin: config.AttachStdin, OpenStdout: config.AttachStdout, OpenStderr: config.AttachStderr, StreamConfig: StreamConfig{}, ProcessConfig: processConfig, Container: container, Running: false, } container.LogEvent("exec_create: " + execConfig.ProcessConfig.Entrypoint + " " + strings.Join(execConfig.ProcessConfig.Arguments, " ")) d.registerExecCommand(execConfig) job.Printf("%s\n", execConfig.ID) return nil }
func (d *Daemon) ContainerExecCreate(config *runconfig.ExecConfig) (string, error) { // Not all drivers support Exec (LXC for example) if err := checkExecSupport(d.execDriver.Name()); err != nil { return "", err } container, err := d.getActiveContainer(config.Container) if err != nil { return "", err } cmd := runconfig.NewCommand(config.Cmd...) entrypoint, args := d.getEntrypointAndArgs(runconfig.NewEntrypoint(), cmd) user := config.User if len(user) == 0 { user = container.Config.User } processConfig := &execdriver.ProcessConfig{ Tty: config.Tty, Entrypoint: entrypoint, Arguments: args, User: user, Privileged: config.Privileged, } execConfig := &execConfig{ ID: stringid.GenerateNonCryptoID(), OpenStdin: config.AttachStdin, OpenStdout: config.AttachStdout, OpenStderr: config.AttachStderr, StreamConfig: StreamConfig{}, ProcessConfig: processConfig, Container: container, Running: false, waitStart: make(chan struct{}), } d.registerExecCommand(execConfig) container.LogEvent("exec_create: " + execConfig.ProcessConfig.Entrypoint + " " + strings.Join(execConfig.ProcessConfig.Arguments, " ")) return execConfig.ID, nil }
func (d *Daemon) ContainerExecCreate(config *runconfig.ExecConfig) (string, error) { if strings.HasPrefix(d.execDriver.Name(), lxc.DriverName) { return "", lxc.ErrExec } container, err := d.getActiveContainer(config.Container) if err != nil { return "", err } cmd := runconfig.NewCommand(config.Cmd...) entrypoint, args := d.getEntrypointAndArgs(runconfig.NewEntrypoint(), cmd) processConfig := execdriver.ProcessConfig{ Tty: config.Tty, Entrypoint: entrypoint, Arguments: args, User: config.User, Privileged: config.Privileged, } execConfig := &execConfig{ ID: stringid.GenerateRandomID(), OpenStdin: config.AttachStdin, OpenStdout: config.AttachStdout, OpenStderr: config.AttachStderr, StreamConfig: StreamConfig{}, ProcessConfig: processConfig, Container: container, Running: false, } container.LogEvent("exec_create: " + execConfig.ProcessConfig.Entrypoint + " " + strings.Join(execConfig.ProcessConfig.Arguments, " ")) d.registerExecCommand(execConfig) return execConfig.ID, nil }
func Convert(c *project.ServiceConfig) (*runconfig.Config, *runconfig.HostConfig, error) { vs := Filter(c.Volumes, isVolume) volumes := make(map[string]struct{}, len(vs)) for _, v := range vs { volumes[v] = struct{}{} } cmd, _ := shlex.Split(c.Command) entrypoint, _ := shlex.Split(c.Entrypoint) ports, binding, err := nat.ParsePortSpecs(c.Ports) if err != nil { return nil, nil, err } restart, err := runconfig.ParseRestartPolicy(c.Restart) if err != nil { return nil, nil, err } dns := c.Dns.Slice() dnssearch := c.DnsSearch.Slice() labels := c.Labels.MapParts() if len(c.Expose) > 0 { exposedPorts, _, err := nat.ParsePortSpecs(c.Expose) ports = exposedPorts if err != nil { return nil, nil, err } } config := &runconfig.Config{ Entrypoint: runconfig.NewEntrypoint(entrypoint...), Hostname: c.Hostname, Domainname: c.DomainName, User: c.User, Env: c.Environment.Slice(), Cmd: runconfig.NewCommand(cmd...), Image: c.Image, Labels: labels, ExposedPorts: ports, Tty: c.Tty, OpenStdin: c.StdinOpen, WorkingDir: c.WorkingDir, Volumes: volumes, } host_config := &runconfig.HostConfig{ VolumesFrom: c.VolumesFrom, CapAdd: c.CapAdd, CapDrop: c.CapDrop, CpuShares: c.CpuShares, Privileged: c.Privileged, Binds: Filter(c.Volumes, isBind), Dns: dns, DnsSearch: dnssearch, LogConfig: runconfig.LogConfig{ Type: c.LogDriver, }, Memory: c.MemLimit, NetworkMode: runconfig.NetworkMode(c.Net), ReadonlyRootfs: c.ReadOnly, PidMode: runconfig.PidMode(c.Pid), IpcMode: runconfig.IpcMode(c.Ipc), PortBindings: binding, RestartPolicy: restart, } return config, host_config, nil }
func Convert(c *project.ServiceConfig) (*runconfig.Config, *runconfig.HostConfig, error) { vs := Filter(c.Volumes, isVolume) volumes := make(map[string]struct{}, len(vs)) for _, v := range vs { volumes[v] = struct{}{} } ports, binding, err := nat.ParsePortSpecs(c.Ports) if err != nil { return nil, nil, err } restart, err := runconfig.ParseRestartPolicy(c.Restart) if err != nil { return nil, nil, err } if exposedPorts, _, err := nat.ParsePortSpecs(c.Expose); err != nil { return nil, nil, err } else { for k, v := range exposedPorts { ports[k] = v } } deviceMappings, err := parseDevices(c.Devices) if err != nil { return nil, nil, err } config := &runconfig.Config{ Entrypoint: runconfig.NewEntrypoint(c.Entrypoint.Slice()...), Hostname: c.Hostname, Domainname: c.DomainName, User: c.User, Env: c.Environment.Slice(), Cmd: runconfig.NewCommand(c.Command.Slice()...), Image: c.Image, Labels: c.Labels.MapParts(), ExposedPorts: ports, Tty: c.Tty, OpenStdin: c.StdinOpen, WorkingDir: c.WorkingDir, VolumeDriver: c.VolumeDriver, Volumes: volumes, } host_config := &runconfig.HostConfig{ VolumesFrom: c.VolumesFrom, CapAdd: runconfig.NewCapList(c.CapAdd), CapDrop: runconfig.NewCapList(c.CapDrop), CpuShares: c.CpuShares, CpusetCpus: c.CpuSet, ExtraHosts: c.ExtraHosts, Privileged: c.Privileged, Binds: Filter(c.Volumes, isBind), Devices: deviceMappings, Dns: c.Dns.Slice(), DnsSearch: c.DnsSearch.Slice(), LogConfig: runconfig.LogConfig{ Type: c.LogDriver, Config: c.LogOpt, }, Memory: c.MemLimit, MemorySwap: c.MemSwapLimit, NetworkMode: runconfig.NetworkMode(c.Net), ReadonlyRootfs: c.ReadOnly, PidMode: runconfig.PidMode(c.Pid), UTSMode: runconfig.UTSMode(c.Uts), IpcMode: runconfig.IpcMode(c.Ipc), PortBindings: binding, RestartPolicy: restart, SecurityOpt: c.SecurityOpt, } return config, host_config, nil }