Configuration

Caution

When you change anything in your docker-sync.yml be sure to run docker-sync clean and docker-sync start right after it. Just running docker-sync start or stop will not recreate the container and your changes will have no effect!

docker-sync.yml

The file docker-sync.yml should be placed in the top-level folder of your project, so docker-sync can find it. The configuration will be searched from the point you run docker-sync from, traversing up the path tree

In there, you usually configure one ( or more ) sync points. Be sure to decide which sync-strategy you want to chose, see Sync strategies.

Below are all the available options, simple examples can be found in the docker-sync-boilerplate.

Important

Be sure to use a sync-name which is unique, since it will be a container name. Do not use your app name, but rather app-sync.

Simple configuration file

This is the simplest version for a configuration.

version: "2"
syncs:
  appcode-native-osx-sync:
    src: './app'

Synchronization options

Configuration options for a synchronzation definition below the top-level syncs.

version: "2"
syncs:
  appcode-native-osx-sync:
    src: './app'
    sync_excludes: ['ignored_folder', '.ignored_dot_folder']

src*

Type:

mandatory

Which folder to watch / sync from - you can use tilde ~, it will get expanded.

The contents of this directory will be synchronized to the Docker volume with the name of this sync entry (appcode-native-osx-sync here).

Be aware that the trailing slash makes a difference. If you add them, only the inner parts of the folder gets synced, otherwise the parent folder will be synced as top-level folder.

Options

Description

Path

Your path to the source you want to sync to the container

sync_host_port*

Type:

mandatory if rsync

Should be a unique port this sync instance uses on the host to offer the rsync service on (do not use this for unison - not needed there.)

default:

No default value

Options

Description

Any number

The port to use (make sure it is unused!)

sync_strategy

Type:

optional

Operating system aware sync strategy.

Remove this option to use the default strategy per OS.

See Sync strategies.

default:
  • native_osx under MacOS (except with docker-machine which use unison),

  • native_linux docker volume under linux

Options

Description

empty

Dynamic detection, depends on the OS.

native_osx

Native docker-for-mac OSFS based sync (OSX only)

unison

Unison based sync (Linux, OSX, Windows)

rsync

Rsync based sync (OSX only)

native_linux

No sync, native mount (Linux only)

sync_userid

Type:

optional

Usually if you map users you want to set the user id of your application container here.

This does not user groupmap but rather configures the server to map.

default:

empty

Options

Description

Any number

The userid you want to map to

sync_groupid

Type:

optional

Usually if you map groups you want to set the group id of your application container here.

This does not user groupmap but rather configures the server to map. This is only available for unison/rsync, not for d4m/native (default) strategies.

default:

empty

Options

Description

Any number

The groupid you want to map to

sync_args

Type:

optional

Use this to switch to rsync verbose mode

default:

empty

Options

Description

String

Any option accepted by rsync, e.g. -v or -L.

sync_excludes

Type:

optional

A list of excludes. These patterns will not be synced.

See http://www.cis.upenn.edu/~bcpierce/unison/download/releases/stable/unison-manual.html#ignore for the possible syntax and see sync_excludes_type below.

default:

empty

Options

Description

empty

do not exclude anything

Array of strings

Array of file and directory names to exclude from sync

Example:

sync_excludes: ['Gemfile.lock', 'Gemfile', 'config.rb', '.sass-cache', 'sass', 'sass-cache', 'composer.json' , 'bower.json', 'package.json', 'Gruntfile*', 'bower_components', 'node_modules', '.gitignore', '.git', '*.coffee', '*.scss', '*.sass']

List example:

sync_excludes:
  - 'Gemfile.lock'
  - 'Gemfile'
  - 'config.rb'
  - '.sass-cache'

sync_excludes_type

Type:

optional

Use this to change the sync_exclude syntax.

For more information see http://www.cis.upenn.edu/~bcpierce/unison/download/releases/stable/unison-manual.html#pathspec

default:

Name

possible values:

Options

Description

Name

If a file or a folder does match this string ( solves nesting problem )

Path

You match the exact path ( nesting problem )

Regex

Define a regular expression

none

You can define a type for each sync exclude ['Name .git', 'Path Gemlock']

sync_host_ip

Type:

optional

When a port of a container is exposed, on which IP does it get exposed. Localhost for docker for mac, something else for docker-machine.

default:

auto

Options

Description

auto

docker-machine/docker host ip will be detected automatically.

IP address

If you set this to a concrete IP, this OP will be enforced

sync_prefe

Type:

optional

Defines how sync conflicts should be handled.

default:

default

Options

Description

default

It will prefer the source

copyonconflict

On conflict, pick the one from the host and copy the conflicted file for backup

watch_args

Type:

optional

Use this to switch to fswatch verbose mode

default:

Empty

Options

Description

String

Every fswatch option like -v

watch_excludes

Type:

optional

A list of regular expressions to exclude from the fswatch - see fswatch docs for details.

IMPORTANT: this is not supported by native_osx.

default:

empty

Options

Description

Array of globs

directory and file names, * are supported

Example:

watch_excludes: ['.*/.git', '.*/node_modules', '.gitignore']

host_disk_mount_mode

Type:

optional

See https://docs.docker.com/docker-for-mac/osxfs-caching/#cached

Options

Description

default

cached

consistent

delegated

monit_enable

Type:

optional

Monit can be used to monitor the health of unison in the native_osx strategy and can restart unison if it detects a problem.

default:

false

Options

Description

false

true

Enable monit

monit_high_cpu_cycles

Type:

optional

Use this to change how many consecutive times high cpu usage must be observed before unison is restarted.

default:

2

Options

Description

2

Wait for 2 cycles

<any integer>

monit_interval

Type:

optional

Use this to change how many seconds between each monit check (cycle).

default:

none

Options

Description

none

<any integer>

Number in seconds

notify_terminal

Type:

optional

On every sync sends a Terminal Notification regarding files being synced. (Mac Only).

Useful for when you want to know exactly when your changes took effect (or failed to do so). Be aware that in case of unison this only gives you a notification on the initial sync, not on syncs after subsequent changes.

default:

false

Options

Description

false

true

Show notifications

errors_only

Show only error notifications

Advanced options

Configuration options below the top-level options key. All advanced options are optional and have default values.

version: "2"
options:
  verbose: true

cli_mode

Defines how the sync will be invoked on the command line. Mostly depending if your are using docker-sync solo, scaffolded or in development (thor).

default:

auto

Options

Description

auto

try to guess automatically

docker-sync

thor

compose-file-path

If you like, you can set a custom location (path) of your compose file like ~/app/compose.yml.

You can also use this as an array to define several compose files to include. Order is important!

default:

docker-compose.yml

Options

Description

docker-compose.yml

The default docker-compose.yml file

A single file name

Alternative docker-compose file

An array of file names

A list of docker-compose files, loaded in order

compose-dev-file-path

If you like, you can set a custom location (path) of your compose file. Do not set it, if you do not want to use it at all.

If its there, it gets used. If you name it explicitly, it HAS to exist.

HINT: you can also use this as an array to define several compose files to include. Order is important!

default:

docker-compose-dev.yml

Options

Description

docker-compose-dev.yml

The default docker-compose-dev.yml file

A single file name

Alternative docker-compose file

An array of file names

A list of docker-compose files, loaded in order

max_attempt

Maximum number of attempts for unison waiting for the success exit status.

Each attempt means 1-second sleep. Only used in unison.

default:

5

project_root

Root directory to be used when transforming sync src into absolute path.

default:

pwd

Options

Description

pwd

Current working directory

config_path

The directory where docker-sync.yml is found

<sync_strategy>_image

The image to use for the rsync container.

Do not change this until you exactly know, what you are doing

Replace <sync_strategy> with either rsync, unison, native_osx to set a custom image for all sync of this type.

verbose

Activate this if you need to debug something.

IMPORTANT: do not run stable with this, it creates a memory leak. Turn off verbose when you are done testin

default:

false

Options

Description

false

true

Output everything

docker-compose.yml

You should split your docker-compose configuration for production and development (as usual). The production stack (docker-compose.yml) does not need any changes and would look like this (and is portable, no docker-sync adjustments).

version: "2"
services:
  someapp:
    image: alpine
    container_name: 'fullexample_app'
    command: ['watch', '-n1', 'cat /var/www/somefile.txt']
  otherapp:
    image: alpine
    container_name: 'simpleexample_app'
    command: ['watch', '-n1', 'cat /app/code/somefile.txt']

docker-compose-dev.yml

The docker-compose-dev.yml ( it needs to be called that way, look like this ) will override this and looks like this.

version: "2"
services:
  someapp:
    volumes:
      - fullexample-sync:/var/www:nocopy # nocopy is important
  otherapp:
    # thats the important thing
    volumes:
      - simpleexample-sync:/app/code:nocopy #  nocopy is important

volumes:
  fullexample-sync:
    external: true
  simpleexample-sync:
    external: true

Tip

Do check that you use nocopy, see below for the explanation

So the docker-compose-dev.yml includes the volume mounts and definitions - your production docker-compose.yml will be overlaid by this when starting the stack with

docker-sync-stack start

This effectively does this in docker-compose terms

docker-compose -f docker-compose.yml -f docker-compose-dev.yml up

Portable docker-compose.yml

Most of you do not want to inject docker-sync specific things into the production docker-compose.yml to keep it portable. There is a good way to achieve this very cleanly based on docker-compose overrides.

  1. Create a docker-compose.yml (you might already have that one) - that is your production file. Do not change anything here, just keep it the way you would run your production environment.

  2. Create a docker-compose-dev.yml - this is where you put your overrides into. You will add the external volume and the mount here, also adding other development ENV variables you might need anyway

Start your compose using:

docker-compose -f docker-compose.yml -f docker-compose-dev.yml up

If you only have macOS- and Linux-based development environments, create docker-compose-Linux.yml and docker-compose-Darwin.yml to put your OS-specific overrides into. Then you may start up your dev environment as:

docker-compose -f docker-compose.yml -f docker-compose-$(uname -s).yml up

You can simplify this command by creating an appropriate shell alias or a Makefile. There is also a feature undergo to let docker-sync-stack support this out of the box, by simply calling:

docker-sync-stack start

A good example for this is a part of the boilerplate project.

Why :nocopy is important?

In case the folder we mount to has been declared as a VOLUME during image build, its content will be merged with the name volume we mount from the host - and thats not what we want. So with nocopy we ignore the contents which have been on the initial volume / image and do enforce the content from our host on the initial wiring

version: "2"
services:
  someapp:
    volumes:
      - fullexample-sync:/var/www

to

version: "2"
services:
  someapp:
    volumes:
      - fullexample-sync:/var/www:nocopy

Environment variables support

Docker-sync supports the use of environment variables from version 0.2.0.

The support is added via implementation of https://github.com/bkeepers/dotenv.

You can set your environment variables by creating a .env file at the root of your project (or form where you will be running the docker-sync commands).

The environment variables work the same as they do with docker-compose.

This allows for simplifying your setup, as you are now able to change the project dependent values instead of modifying yaml files for each project.

Tip

You can change the default file using DOCKER_SYNC_ENV_FILE, e.g. if .env is already used for something else, you could use .docker-sync-env by setting export DOCKER_SYNC_ENV_FILE=.docker-sync-env

# contents of your .env file
WEB_ROOT=/Users/me/Development/web
API_ROOT=./dir

The environment variables will be picked up by docker-compose

services:
  api:
    build: ${API_ROOT}

and by docker-sync as well.

# WEB_ROOT is /Users/me/Development/web
syncs:
  web-rsync:
    src: "${WEB_ROOT}"

For a detailed example take a look at https://github.com/EugenMayer/docker-sync-boilerplate/tree/master/dynamic-configuration-dotnev.