Shan Khan
Shan Khan

Reputation: 10319

Docker compose Invalid volume destination path: '.' mount path must be absolute

Following is my dockerfile that works to run the H2 Database: I want to create a docker compose file for this.

FROM klousiaj/oracle-java:7.79
MAINTAINER J.P. Klousia <klousiaj>

ENV DOWNLOAD http://www.h2database.com/h2-2016-10-31.zip
ENV DATA_DIR /opt/h2-data

RUN curl ${DOWNLOAD} -o h2.zip \
    && unzip h2.zip -d /opt/ \
    && rm h2.zip \
    && mkdir -p ${DATA_DIR}

EXPOSE 8082 9092

CMD java -cp /opt/h2/bin/h2*.jar org.h2.tools.Server \
    -web -webAllowOthers -webPort 8082 \
    -tcp -tcpAllowOthers -tcpPort 9092 \
    -baseDir ${DATA_DIR}

VOLUME ${DATA_DIR}

Following is the docker compose i am trying to perform:

version: '2'


services:
    db:
        image: klousiaj/oracle-java:7.79
        environment: 
            DOWNLOAD: http://www.h2database.com/h2-2016-10-31.zip
            DATA_DIR: /opt/h2-data
        command: curl ${DOWNLOAD} -o h2.zip \ && unzip h2.zip -d /opt/ \ && rm h2.zip \ && mkdir -p ${DATA_DIR}
        expose: 
            - "8082-9092"
        command: java -cp /opt/h2/bin/h2*.jar org.h2.tools.Server \ -web -webAllowOthers -webPort 8082 \ -tcp -tcpAllowOthers -tcpPort 9092 \ -baseDir ${DATA_DIR}
        volumes: 
            - ${DATA_DIR}

Im getting error as :

ERROR: for db Cannot create container for service db: Invalid volume spec ".": Invalid volume destination path: '.' mount path must be absolute.

Upvotes: 20

Views: 88278

Answers (7)

Anmol
Anmol

Reputation: 1

The error i encountered indicates that the mount path for the volume in the Docker configuration is incorrect. The mount path must be an absolute path. Here’s how you can fix it: step1:Edit the docker-compose.yml File: step2:Update the mount path to be absolute

for avoiding any hustle Restart Docker Compose

Upvotes: -1

Alter Lagos
Alter Lagos

Reputation: 12540

My error was that the path had a colon as part of it.
To make it work, I enclosed the path with single quotes:

volumes:
  - type: bind
    source: './path-with-colon:2.4.10-server/bundle'
    target: '/usr/local/bundle'

Upvotes: 0

sylvesterasa
sylvesterasa

Reputation: 323

Remove the . before app Change this

volumes:
      - ./api:/app
      - ./app/node_modules

to

volumes:
      - ./api:/app
      - /app/node_modules

Because the /app or whatever you named your working directory in created in /.

Upvotes: 11

Emon Khan
Emon Khan

Reputation: 21

I got the same problem and inside my docker-compose.yaml I got the code inside the volumes which is given below:
---Before(I got the error message in the terminal)---

volumes:
      - ./api:/app
      - ./app/node_modules

---After(The problem is fixed)---

volumes:
      - ./api:/app
      - /app/node_modules

Upvotes: 2

Rida
Rida

Reputation: 89

Sometimes just an extra space can cause the problem (my case): Shouldn't be like that:

volumes:
      - ./api/app: /app

but :

volumes:
      - ./api/app:/app

Upvotes: 4

Collin Thomas
Collin Thomas

Reputation: 1700

I had the same error message, it was a silly mistake. I forgot to put the leading forward slash on container directory /app

Before

volumes:
      - ./api/app:app

After

volumes:
      - ./api/app:/app

Upvotes: 13

Eugen Mayer
Eugen Mayer

Reputation: 9896

This is just not allowed in the Compose file, since you do not have a template engine there.

You will not need to define

volumes: 
        - /opt/h2-data

Since that will be done automatically (anonymous volume). If you want to have a named volume use

volumes: 
        - myname:/opt/h2-data

or a host mount

volumes: 
        - /path/on/the/host:/opt/h2-data

So ${DATA_DIR} is not expanded in the volumes ( from the ENV ) in a compose file. There are dialects like rancher-compose providing this, but in general that is not possible

UPDATED: Updated my answer since I somehow mixed the Dockerfile/docker-compose.yml file. It makes sense in the Dockerfile, since it is just used as a variable. Thank you for hinting me on that @Bmitch (once again)

Upvotes: 18

Related Questions