Skip to content

Containers

Helper methods for containers.

List

List containers on remote.

Parameters & Call

Parameter Type Description Default
remote string LXD remote local
mutator function Mutation function
// apply no mutation to the response
lxc.containers.list('local').then(response => {
    // [ '/1.0/containers/my-container' ]
    console.log(response)
})

// apply stripEndpoint on response
lxc.containers.list('local', response => lxc.containers.stripEndpoint(response)).then(response => {
    // [ 'my-container' ]
    console.log(response)
})

// or you could write your own
lxc.containers.list('local', response => {
    let ret = []
    response.forEach(value => {
      ret.push(value.replace(lxc.containers.baseEndpoint + '/', ''))
    })
    return ret
}).then(response => {
    // [ 'my-container' ]
    console.log(response)
})

Response

[ 
    '/1.0/containers/my-container'
]

Info

Get container information.

Parameters & Call

Parameter Type Description Default
remote string LXD remote local
name string Container name
mutator function Mutation function
lxc.containers.info('local', 'my-container').then(response => {
    console.log(response);
})

Response

{
    "architecture": "x86_64",
    "config": {
        "image.architecture": "amd64",
        "image.description": "ubuntu 16.04 LTS amd64 (release) (20180405)",
        "image.label": "release",
        "image.os": "ubuntu",
        "image.release": "xenial",
        "image.serial": "20180405",
        "image.version": "16.04",
        "volatile.base_image": "be7cec7c948958adfbb9bc7dbd292762d2388cc883466815fc2b6bc06bf06f5a",
        "volatile.eth0.hwaddr": "00:16:3e:fb:89:0a",
        "volatile.idmap.base": "0",
        "volatile.idmap.next": "[{\"Isuid\":true,\"Isgid\":false,\"Hostid\":100000,\"Nsid\":0,\"Maprange\":65536},{\"Isuid\":false,\"Isgid\":true,\"Hostid\":100000,\"Nsid\":0,\"Maprange\":65536}]",
        "volatile.last_state.idmap": "[{\"Isuid\":true,\"Isgid\":false,\"Hostid\":100000,\"Nsid\":0,\"Maprange\":65536},{\"Isuid\":false,\"Isgid\":true,\"Hostid\":100000,\"Nsid\":0,\"Maprange\":65536}]",
        "volatile.last_state.power": "RUNNING"
    },
    "created_at": "2018-04-08T15:41:08Z",
    "description": "",
    "devices": {},
    "ephemeral": false,
    "expanded_config": {
        "image.architecture": "amd64",
        "image.description": "ubuntu 16.04 LTS amd64 (release) (20180405)",
        "image.label": "release",
        "image.os": "ubuntu",
        "image.release": "xenial",
        "image.serial": "20180405",
        "image.version": "16.04",
        "volatile.base_image": "be7cec7c948958adfbb9bc7dbd292762d2388cc883466815fc2b6bc06bf06f5a",
        "volatile.eth0.hwaddr": "00:16:3e:fb:89:0a",
        "volatile.idmap.base": "0",
        "volatile.idmap.next": "[{\"Isuid\":true,\"Isgid\":false,\"Hostid\":100000,\"Nsid\":0,\"Maprange\":65536},{\"Isuid\":false,\"Isgid\":true,\"Hostid\":100000,\"Nsid\":0,\"Maprange\":65536}]",
        "volatile.last_state.idmap": "[{\"Isuid\":true,\"Isgid\":false,\"Hostid\":100000,\"Nsid\":0,\"Maprange\":65536},{\"Isuid\":false,\"Isgid\":true,\"Hostid\":100000,\"Nsid\":0,\"Maprange\":65536}]",
        "volatile.last_state.power": "RUNNING"
    },
    "expanded_devices": {
        "eth0": {
            "name": "eth0",
            "nictype": "bridged",
            "parent": "lxdbr0",
            "type": "nic"
        },
        "root": {
            "path": "/",
            "pool": "default",
            "type": "disk"
        }
    },
    "last_used_at": "2018-04-08T20:09:53Z",
    "location": "",
    "name": "my-container",
    "profiles": [
        "default"
    ],
    "stateful": false,
    "status": "Running",
    "status_code": 103
}

Express

In express you might do something like the following, to get all containers and then enumerate their information.

app.get("/containers", function(req, res) {
  //
  lxc.containers.list('local', response => lxc.containers.stripEndpoint(response)).then(containers => {
    let promises = []
    //
    containers.forEach(container => {
      promises.push(lxc.containers.info('local', container))
    })
    //
    Promise.all(promises).then(results => {
      res.json(results)
    })
  })
})

Get State

Get the state of a container.

Parameters & Call

Parameter Type Description Default
remote string LXD remote local
container string The container name
lxc.containers.getState('local', 'container-name').then(response => {
    console.log(response);
})

Response

{
    "cpu": {
        "usage": 15159435138
    },
    "disk": {},
    "memory": {
        "swap_usage": 0,
        "swap_usage_peak": 0,
        "usage": 239001600,
        "usage_peak": 314175488
    },
    "network": {
        "eth0": {
            "addresses": [
                {
                    "address": "10.189.110.190",
                    "family": "inet",
                    "netmask": "24",
                    "scope": "global"
                },
                {
                    "address": "fe80::216:3eff:fefb:890a",
                    "family": "inet6",
                    "netmask": "64",
                    "scope": "link"
                }
            ],
            "counters": {
                "bytes_received": 26351929,
                "bytes_sent": 706569,
                "packets_received": 18810,
                "packets_sent": 10095
            },
            "host_name": "vethQGS6S6",
            "hwaddr": "00:16:3e:fb:89:0a",
            "mtu": 1500,
            "state": "up",
            "type": "broadcast"
        },
        "lo": {
            "addresses": [
                {
                    "address": "127.0.0.1",
                    "family": "inet",
                    "netmask": "8",
                    "scope": "local"
                },
                {
                    "address": "::1",
                    "family": "inet6",
                    "netmask": "128",
                    "scope": "local"
                }
            ],
            "counters": {
                "bytes_received": 0,
                "bytes_sent": 0,
                "packets_received": 0,
                "packets_sent": 0
            },
            "host_name": "",
            "hwaddr": "",
            "mtu": 65536,
            "state": "up",
            "type": "loopback"
        }
    },
    "pid": 7156,
    "processes": 30,
    "status": "Running",
    "status_code": 103
}

Set State

Set the state of a container on remote, this allows for more flexibility then calling the (start, stop, restart, freeze, unfreeze) methods below as you can set the options parameter.

Parameters & Call

Parameter Type Description Default
remote string LXD remote local
container string The container name
options object | json Container state options
lxc.containers.setState('local', 'container-name',  {
    "action": "stop",  # State change action (stop, start, restart, freeze or unfreeze)
    "timeout": 30,     # A timeout after which the state change is considered as failed
    "force": true,     # Force the state change (currently only valid for stop and restart where it means killing the container)
    "stateful": true   # Whether to store or restore runtime state before stopping or startiong (only valid for stop and start, defaults to false)
}).then(response => {
    console.log(response)
})

Response

{
    class: 'task',
    created_at: '2018-04-08T16:37:36.511708398Z',
    description: '[Stopping, Starting, Restarting, Freezing, Unfreezing] container',
    err: '',
    id: '4850b25b-3a9a-4666-acf6-9f2b4c25a236',
    may_cancel: false,
    metadata: null,
    resources: {
        containers: [
            '/1.0/containers/my-container'
        ]
    },
    status: 'Running',
    status_code: 103,
    updated_at: '2018-04-08T16:37:36.511708398Z'
}

Replace

Replaces container configuration or restore snapshot.

Parameters & Call

Parameter Type Description Default
remote string LXD remote local
name string Container name
options object Container options
mutator function Mutation function
lxc.containers.replace('local', 'my-container', {
    "architecture": "x86_64",
    "config": {
        "limits.cpu": "4",
        "volatile.base_image": "97d97a3d1d053840ca19c86cdd0596cf1be060c5157d31407f2a4f9f350c78cc",
        "volatile.eth0.hwaddr": "00:16:3e:1c:94:38"
    },
    "devices": {
        "rootfs": {
            "path": "/",
            "type": "disk"
        }
    },
    "ephemeral": true,
    "profiles": [
        "default"
    ]
}).then(response => {
    console.log(response)
})

Response

{

}

Update

Update container configuration.

Parameters & Call

Parameter Type Description Default
remote string LXD remote local
name string Container name
options object Container options
mutator function Mutation function
lxc.containers.replace('local', 'my-container', {
    "config": {
        "limits.cpu": "4"
    },
    "devices": {
        "rootfs": {
            "size": "5GB"
        }
    },
    "ephemeral": true
}).then(response => {
    console.log(response)
})

Response

{

}

Rename

Rename a container.

Parameters & Call

Parameter Type Description Default
remote string LXD remote local
name string Container name
newName string New container name
mutator function Mutation function
lxc.containers.rename('local', 'old-name', 'new-name').then(response => {
    console.log(response)
})

Response

{

}

Create

Create a container.

Parameters & Call

Parameter Type Description Default
remote string LXD remote local
options object The container options

Full container options can be found here: https://github.com/lxc/lxd/blob/master/doc/rest-api.md#post-1

// example from local
lxc.containers.create('local', {
    "name": "my-new-container",
    "architecture": "x86_64",
    "profiles": ["default"],
    "ephemeral": true,
    "config": { "limits.cpu": "2" },
    "devices": {},
    "source": {
        "type": "image",
        "fingerprint": "be7cec7c9489"
    }
}).then(response => {
    console.log(response)
})

// example from https://images.linuxcontainers.org
lxc.containers.create('local', {
  'name': 'my-new-container',
  'architecture': 'x86_64',
  'profiles': ['default'],
  'ephemeral': true,
  'config': { 'limits.cpu': '2' },
  'devices': {},
  'source': {
    'type': 'image',
    'mode': 'pull',
    'server': 'https://images.linuxcontainers.org:8443',
    'protocol': 'simplestreams',
    'alias': 'ubuntu/16.04'

  }
}).then(response => {
  console.log(response)
})

Response

{
    "class": "task",
    "created_at": "2018-04-08T22:49:33.892947111Z",
    "description": "Creating container",
    "err": "",
    "id": "cfd9cd81-a651-4b9b-bd89-4667cc51ad4b",
    "may_cancel": false,
    "metadata": null,
    "resources": {
        "containers": [
            "/1.0/containers/my-new-container"
        ]
    },
    "status": "Running",
    "status_code": 103,
    "updated_at": "2018-04-08T22:49:33.892947111Z"
}

*you could also simply call lxc.local() to run what you would normally run on cmd line:

// same as above
lxc.local('lxc launch ubuntu:16.04 my-new-container')

// launch on a remote
lxc.local('lxc launch ubuntu:16.04 production:my-container')

// launch local image on a remote
lxc.local('lxc launch local:<fingerprint> production:my-container')

// launch remote image on a remote
lxc.local('lxc launch staging:<fingerprint> production:my-container')

Start

Start a container.

Parameters & Call

Parameter Type Description Default
remote string LXD remote local
container string The container name
lxc.containers.start('local', 'container-name').then(response => {
    console.log(response)
})

Response

{
    class: 'task',
    created_at: '2018-04-08T16:37:36.511708398Z',
    description: 'Starting container',
    err: '',
    id: '4850b25b-3a9a-4666-acf6-9f2b4c25a236',
    may_cancel: false,
    metadata: null,
    resources: {
        containers: [
            '/1.0/containers/my-container'
        ]
    },
    status: 'Running',
    status_code: 103,
    updated_at: '2018-04-08T16:37:36.511708398Z'
}

Stop

Stop a container.

Parameters & Call

Parameter Type Description Default
remote string LXD remote local
container string The container name
lxc.containers.stop('local', 'container-name').then(response => {
    console.log(response)
})

Response

{
    class: 'task',
    created_at: '2018-04-08T16:37:36.511708398Z',
    description: 'Stopping container',
    err: '',
    id: '4850b25b-3a9a-4666-acf6-9f2b4c25a236',
    may_cancel: false,
    metadata: null,
    resources: {
        containers: [
            '/1.0/containers/my-container'
        ]
    },
    status: 'Running',
    status_code: 103,
    updated_at: '2018-04-08T16:37:36.511708398Z'
}

Restart

Restart a container.

Parameters & Call

Parameter Type Description Default
remote string LXD remote local
container string The container name
lxc.containers.restart('local', 'container-name').then(response => {
    console.log(response)
})

Response

{
    class: 'task',
    created_at: '2018-04-08T16:37:36.511708398Z',
    description: 'Restarting container',
    err: '',
    id: '4850b25b-3a9a-4666-acf6-9f2b4c25a236',
    may_cancel: false,
    metadata: null,
    resources: {
        containers: [
            '/1.0/containers/my-container'
        ]
    },
    status: 'Running',
    status_code: 103,
    updated_at: '2018-04-08T16:37:36.511708398Z'
}

Freeze

Freeze a container.

Parameters & Call

Parameter Type Description Default
remote string LXD remote local
container string The container name
lxc.containers.freeze('local', 'container-name').then(response => {
    console.log(response)
})

Response

{
    class: 'task',
    created_at: '2018-04-08T16:37:36.511708398Z',
    description: 'Freezing container',
    err: '',
    id: '4850b25b-3a9a-4666-acf6-9f2b4c25a236',
    may_cancel: false,
    metadata: null,
    resources: {
        containers: [
            '/1.0/containers/my-container'
        ]
    },
    status: 'Running',
    status_code: 103,
    updated_at: '2018-04-08T16:37:36.511708398Z'
}

Unfreeze

Unfreeze a container.

Parameters & Call

Parameter Type Description Default
remote string LXD remote local
container string The container name
lxc.containers.unfreeze('local', 'container-name').then(response => {
    console.log(response)
})

Response

{
    class: 'task',
    created_at: '2018-04-08T16:37:36.511708398Z',
    description: 'Thawing container',
    err: '',
    id: '4850b25b-3a9a-4666-acf6-9f2b4c25a236',
    may_cancel: false,
    metadata: null,
    resources: {
        containers: [
            '/1.0/containers/my-container'
        ]
    },
    status: 'Running',
    status_code: 103,
    updated_at: '2018-04-08T16:37:36.511708398Z'
}

Delete

Delete a container.

Parameters & Call

Parameter Type Description Default
remote string LXD remote local
name string Container name
mutator function Mutation function
lxc.containers.delete('local', 'container-name').then(response => {
    console.log(response)
})

Response

{

}

Exec

Run a command in container.

Parameters & Call

Parameter Type Description Default
remote string LXD remote local
name string Container name
options object The container options
mutator function Mutation function
lxc.containers.exec('local', 'my-container', {
    "command": ["/bin/bash"],
    "environment": {},
    "wait-for-websocket": false,
    "record-output": false,
    "interactive": false,
    "width": 80,
    "height": 25
}).then(response => {
    console.log(response);
})

Response

{
    "class": "task",
    "created_at": "2018-04-16T01:58:34.642661556Z",
    "description": "Executing command",
    "err": "",
    "id": "bff27d5c-f54c-4fb4-8956-60bcea56d074",
    "may_cancel": false,
    "metadata": null,
    "resources": {
        "containers": [
            "/1.0/containers/my-container"
        ]
    },
    "status": "Running",
    "status_code": 103,
    "updated_at": "2018-04-16T01:58:34.642661556Z"
}

Comments