| --- |
| description: Volume plugin for Amazon EBS |
| keywords: "API, Usage, plugins, documentation, developer, amazon, ebs, rexray, volume" |
| --- |
| |
| <!-- This file is maintained within the docker/cli GitHub |
| repository at https://github.com/docker/cli/. Make all |
| pull requests against that repo. If you see this file in |
| another repository, consider it read-only there, as it will |
| periodically be overwritten by the definitive file. Pull |
| requests which include edits to this file in other repositories |
| will be rejected. |
| --> |
| |
| # Volume plugin for Amazon EBS |
| |
| ## A proof-of-concept Rexray plugin |
| |
| In this example, a simple Rexray plugin will be created for the purposes of using |
| it on an Amazon EC2 instance with EBS. It is not meant to be a complete Rexray plugin. |
| |
| The example source is available at [https://github.com/tiborvass/rexray-plugin](https://github.com/tiborvass/rexray-plugin). |
| |
| To learn more about Rexray: [https://github.com/codedellemc/rexray](https://github.com/codedellemc/rexray) |
| |
| ## 1. Make a Docker image |
| |
| The following is the Dockerfile used to containerize rexray. |
| |
| ```dockerfile |
| FROM debian:jessie |
| RUN apt-get update && apt-get install -y --no-install-recommends wget ca-certificates |
| RUN wget https://dl.bintray.com/emccode/rexray/stable/0.6.4/rexray-Linux-x86_64-0.6.4.tar.gz -O rexray.tar.gz && tar -xvzf rexray.tar.gz -C /usr/bin && rm rexray.tar.gz |
| RUN mkdir -p /run/docker/plugins /var/lib/libstorage/volumes |
| ENTRYPOINT ["rexray"] |
| CMD ["--help"] |
| ``` |
| |
| To build it you can run `image=$(cat Dockerfile | docker build -q -)` and `$image` |
| will reference the containerized rexray image. |
| |
| ## 2. Extract rootfs |
| |
| ```sh |
| $ TMPDIR=/tmp/rexray # for the purpose of this example |
| $ # create container without running it, to extract the rootfs from image |
| $ docker create --name rexray "$image" |
| $ # save the rootfs to a tar archive |
| $ docker export -o $TMPDIR/rexray.tar rexray |
| $ # extract rootfs from tar archive to a rootfs folder |
| $ ( mkdir -p $TMPDIR/rootfs; cd $TMPDIR/rootfs; tar xf ../rexray.tar ) |
| ``` |
| |
| ## 3. Add plugin configuration |
| |
| We have to put the following JSON to `$TMPDIR/config.json`: |
| |
| ```json |
| { |
| "Args": { |
| "Description": "", |
| "Name": "", |
| "Settable": null, |
| "Value": null |
| }, |
| "Description": "A proof-of-concept EBS plugin (using rexray) for Docker", |
| "Documentation": "https://github.com/tiborvass/rexray-plugin", |
| "Entrypoint": [ |
| "/usr/bin/rexray", "service", "start", "-f" |
| ], |
| "Env": [ |
| { |
| "Description": "", |
| "Name": "REXRAY_SERVICE", |
| "Settable": [ |
| "value" |
| ], |
| "Value": "ebs" |
| }, |
| { |
| "Description": "", |
| "Name": "EBS_ACCESSKEY", |
| "Settable": [ |
| "value" |
| ], |
| "Value": "" |
| }, |
| { |
| "Description": "", |
| "Name": "EBS_SECRETKEY", |
| "Settable": [ |
| "value" |
| ], |
| "Value": "" |
| } |
| ], |
| "Interface": { |
| "Socket": "rexray.sock", |
| "Types": [ |
| "docker.volumedriver/1.0" |
| ] |
| }, |
| "Linux": { |
| "AllowAllDevices": true, |
| "Capabilities": ["CAP_SYS_ADMIN"], |
| "Devices": null |
| }, |
| "Mounts": [ |
| { |
| "Source": "/dev", |
| "Destination": "/dev", |
| "Type": "bind", |
| "Options": ["rbind"] |
| } |
| ], |
| "Network": { |
| "Type": "host" |
| }, |
| "PropagatedMount": "/var/lib/libstorage/volumes", |
| "User": {}, |
| "WorkDir": "" |
| } |
| ``` |
| |
| Note a couple of points: |
| - `PropagatedMount` is needed so that the docker daemon can see mounts done by the |
| rexray plugin from within the container, otherwise the docker daemon is not able |
| to mount a docker volume. |
| - The rexray plugin needs dynamic access to host devices. For that reason, we |
| have to give it access to all devices under `/dev` and set `AllowAllDevices` to |
| true for proper access. |
| - The user of this simple plugin can change only 3 settings: `REXRAY_SERVICE`, |
| `EBS_ACCESSKEY` and `EBS_SECRETKEY`. This is because of the reduced scope of this |
| plugin. Ideally other rexray parameters could also be set. |
| |
| ## 4. Create plugin |
| |
| `docker plugin create tiborvass/rexray-plugin "$TMPDIR"` will create the plugin. |
| |
| ```sh |
| $ docker plugin ls |
| ID NAME DESCRIPTION ENABLED |
| 2475a4bd0ca5 tiborvass/rexray-plugin:latest A rexray volume plugin for Docker false |
| ``` |
| |
| ## 5. Test plugin |
| |
| ```sh |
| $ docker plugin set tiborvass/rexray-plugin EBS_ACCESSKEY=$AWS_ACCESSKEY EBS_SECRETKEY=$AWS_SECRETKEY` |
| $ docker plugin enable tiborvass/rexray-plugin |
| $ docker volume create -d tiborvass/rexray-plugin my-ebs-volume |
| $ docker volume ls |
| DRIVER VOLUME NAME |
| tiborvass/rexray-plugin:latest my-ebs-volume |
| $ docker run --rm -v my-ebs-volume:/volume busybox sh -c 'echo bye > /volume/hi' |
| $ docker run --rm -v my-ebs-volume:/volume busybox cat /volume/hi |
| bye |
| ``` |
| |
| ## 6. Push plugin |
| |
| First, ensure you are logged in with `docker login`. Then you can run: |
| `docker plugin push tiborvass/rexray-plugin` to push it like a regular docker |
| image to a registry, to make it available for others to install via |
| `docker plugin install tiborvass/rexray-plugin EBS_ACCESSKEY=$AWS_ACCESSKEY EBS_SECRETKEY=$AWS_SECRETKEY`. |