简体   繁体   中英

How to mount the folder as volume that docker image build creates?

The docker-compose file is as follows:

version: "3"

services:
  backend:
    build:
      context: .
      dockerfile: dockerfile_backend
    image: backend:dev1.0.0
    entrypoint: ["sh", "-c"]
    command: python manage.py runserver
    ports:
      - "4000:4000"

The docker build creates a folder lets say /docker_container/configs which has files like config.json and db.sqlite3 . The mounting of this folder as volumes is necessary because during runtime the content of the folder gets modified or updated,these changes should not be lost.

I have tried adding a volumes as follows:

    volumes:
      - /host_path/configs:/docker_container/configs

Here the problem is mount point of the hostpath( /host_path/configs ) is empty initially so the container image folder( /docker_container/configs ) also gets empty. How could this problem be solved?.

You are using a Bind Mount which will "hide" the content already existing in your image as you describe - /host_path/configs being empty, /docker_container/configs will be empty as well.

You can use named Volumes instead which will automatically populate the volume with content already existing in the image and allow you to perform updates as you described:

services:
  backend:
    # ...
    #
    # content of /docker_container/configs from the image
    # will be copied into backend-volume
    # and accessible at runtime
    volumes:
    - backend-volume:/docker_container/configs

volumes:
  backend-volume:

As stated in the Volume doc :

If you start a container which creates a new volume [...] and the container has files or directories in the directory to be mounted [...] the directory's contents are copied into the volume

You can pre-populate the host directory once by copying the content from the image to directory.

 docker run --rm backend:dev1.0.0 tar -cC /docker_container/config/ . | tar -xC /host_path/configs

Then start your compose project as it is and the host path already has the original content from the image.


Another approach is to have an entrypoint script that copies content to the mounted volume.

You can mount the host path to a different path(say /docker_container/config_from_host ) and have an entrypoint script which copies content from /docker_container/configs into /docker_container/config_from_host if the directory is empty.

Sample pseudo code:

$ cat Dockerfile
  RUN cp entrypoint.sh /entrypoint.sh
  CMD /entrypoint.sh

$ cat entrypoint.sh:
   #!/bin/bash
   if /docker_container/config_from_host is empty; then
        cp -r /docker_container/config/* /docker_container/config_from_host
   fi
   python manage.py runserver

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM