

The minimum set of files we want to sync is the actual source code that is committed into git. Look at your .gitignore for hints on what to remove in your project. For our Elixir service we have dependencies, and build artifacts, that are written to disk, so moving deps and _build folders external to the shared project folder should speed things up.
Let’s set up a docker-compose-override.ymlfile. This file is loaded by default unless you explicitly don’t load it by using the -f flag (eg docker-compose -f docker-compose.yml build) will not use the override file, whereas (eg docker-compose build) will use the developer overlay file (as well as the original).
deps_path and build_path attributes:mix.exs
def project do
[
app: :lab_fulfillment_service,
aliases: aliases(),
build_path: System.get_env("ELIXIR_BUILD_PATH") || './_build',
deps_path: System.get_env("ELIXIR_DEPS_PATH") || './deps',
deps: deps()
]
end
docker-compose-override.ymlfile to pass through the location of where to put the build and deps files:app:
volumes:
- .:/opt/app
- elixir-artifacts:/opt/elixir-artifacts
environment:
ELIXIR_BUILD_PATH: /opt/elixir-artifacts/_build
ELIXIR_DEPS_PATH: /opt/elixir-artifacts/deps
volumes:
elixir-artifacts: {}
The results show a speed improvement of 2.6 to 8 times. However, this is still slow compared to linux. If you must run Docker for Mac I would still recommend further optimisation investigations. Also note that the optimisation actually made the linux version slower. This suggests that using an explicit volume is slower than the default volume. The full results are here:
╔══════════════════════════════════════╦══════════╦════════════╗
║ Machine ║ One Test ║ Test Suite ║
╠══════════════════════════════════════╬══════════╬════════════╣
║ 1. Docker for Mac ║ 1m41.02s ║ 2m45 ║
║ 1. Docker for Mac (optimised) ║ 0m12.980 ║ 1m02.9s ║
║ 2. VM Linux Docker on Mac ║ 0m6.1s ║ 0m56 ║
║ 2. VM Linux Docker on Mac (optimised)║ 0m12.980 ║ 1m02.9s ║
╚══════════════════════════════════════╩══════════╩════════════╝