How To: Mount volumes in a composition step where source is inside the Codefresh Volume
This article describes how to mount a volume within a named Docker volume to overcome the Docker limitation.
NOTE
This article is relevant whendocker-compose.ymlfile in thecompositionstep.
Overview
Compositions steps can only mount ${{CF_VOLUME_NAME}}:${{CF_VOLUME_PATH}}.
If you need to mount /codefresh/volume/<REPO>/<DIR>/ to /<DIR>, due to a Docker limitation, you cannot specify a directory inside a named Docker volume. See here.
How to
Scenario
- Sample data in Git repo must be mounted to /databasedirectory.
- The custom image needs access to /databasefor proper execution.
- The Dockerfile already runs a script on container startup.
Sample docker-compose.yml
version: '3.0' 
services: 
  database: 
    image: myimage:1.0.2 
    volumes: 
      - ./:/database
Sample codefresh.yml
version: 1.0
stages:
  - Clone
  - Build
  - Test
steps:
  main_clone:
    title: Cloning Repo
    type: git-clone
    stage: Clone
    arguments:
      repo: ${{CF_REPO_OWNER}}/${{CF_REPO_NAME}}
      git: cf-support-bot
      revision: ${{CF_REVISION}}
  conform:
    title: Fix docker compose
    type: composition-editor:1.1.0
    stage: Build
    arguments:
      DIRECTORY: ${{CF_VOLUME_PATH}}/${{CF_REPO_NAME}}
      YAMLFILE: docker-compose.yml
      CONFORM_COMPOSITION: true
      KEYVALUE_PAIRS:
        - services.database.volumes.0=${{CF_VOLUME_NAME}}:${{CF_VOLUME_PATH}}
        - services.database.command=bash -c "ln -s ${{CF_VOLUME_PATH}}/${{CF_REPO_NAME}} /database && ./start.sh"
  composition:
    title: Running Composition
    type: composition
    stage: Test
    arguments:
      composition: docker-compose.yml
      composition_candidates:
        test_service:
          image: alpine
          command: sleep 20
          volumes:
            - ${{CF_VOLUME_NAME}}:${{CF_VOLUME_PATH}}
In the step conform.arguments.KEYVALUE_PAIRS:
- Volumes mount is replaced by ${{CF_VOLUME_NAME}}:${{CF_VOLUME_PATH}}.
- The command bash -c "ln -s ${{CF_VOLUME_PATH}}/${{CF_REPO_NAME}}/<DIR>/ /database && ./start.sh":- Symlinks the directory in the Git repo to the /databasedirectory
- Executes the script already in the container
 
- Symlinks the directory in the Git repo to the 
Once this is done, composition steps will run and have the correct mounts and directories where needed.