Skip to main content

How to Use JuiceFS in Docker

JuiceFS can be integrated with Docker Engine with a volume plugin.

Install plugin

Install the plugin with the following command, some privileges must be granted for FUSE.

$ docker plugin install juicedata/juicefs
Plugin "juicedata/juicefs" is requesting the following privileges:
- network: [host]
- device: [/dev/fuse]
- capabilities: [CAP_SYS_ADMIN]
Do you grant the above permissions? [y/N] y
latest: Pulling from juicedata/juicefs
bb7fe456a3d7: Download complete
Digest: sha256:e49817cdde62aa0596e5d61cbb805ee04c5921322ec696ddfc5e92d0ece4562f
Status: Downloaded newer image for juicedata/juicefs:latest
Installed plugin juicedata/juicefs

Create Volume

Credentials for JuiceFS and object storage access must be provided when creating a new volume:

$ docker volume create -d juicedata/juicefs \
-o name=$JFS_NAME -o token=$JFS_TOKEN \
-o accesskey=$ACCESS_KEY -o secretkey=$SECRET_KEY jfsvolume

You can find JFS_TOKEN in volume setting tab in JuiceFS console, i.e. https://juicefs.com/console/vol/<jfs_name>/setting

Mount Volume

Mount the volume in Docker. For example

$ docker run -it -v jfsvolume:/jfs busybox ls /jfs

Remove Volume

$ docker volume remove jfsvolume

Note that:

  1. the volume must be unmounted from all usage before removing.
  2. removing the volume from Docker does NOT affect the data stored in JuiceFS

Disable and remove plugin

$ docker plugin disable juicedata/juicefs
$ docker plugin remove juicedata/juicefs

Using docker-compose

Example for creating and mounting JuiceFS volume with docker-compose

version: '3'
services:
busybox:
image: busybox
command: "ls /jfs"
volumes:
- jfsvolume:/jfs
volumes:
jfsvolume:
driver: juicedata/juicefs
driver_opts:
name: ${JFS_NAME}
token: ${JFS_TOKEN}
accesskey: ${ACCESS_KEY}
secretkey: ${SECRET_KEY}

The secrets could be passed via environment variables.

To bring up the services

docker-compose up

To shut down the service and remove docker volumes

docker-compose down --volumes

Use in Docker swarm

JuiceFS volume can be shared in Docker swarm by creating service.

Make sure that volume plugin juicedata/juicefs is installed on every worker node.

Pass options to --mount to create service mounting JuiceFS volume.

docker service create --name nginx --mount \
type=volume,volume-driver=juicedata/juicefs,source=jfsvolume,destination=/jfs,\
volume-opt=name=$JFS_VOL,volume-opt=token=$JFS_TOKEN,volume-opt=accesskey=$ACCESS_KEY,volume-opt=secretkey=$SECRET_KEY nginx:alpine