How to mount a single file in a volume

匿名 (未验证) 提交于 2019-12-03 01:27:01

问题:

I am pretty new to docker, and some concepts of volumes are quite confusing to me.

What I am trying to do is to dockerize a php application. In the dockerfile I download the archive, extract it etc.

Everything works fine, however if a new version gets released, and I update the dockerfile I have to reinstall the application, because the config.php gets overwritten.

So I thought I can mount the file as a volume, like I do with the database.

I tried it two ways, with a volume and a direct path.

docker-compose:

version: '2' services:   app:     build: src     ports:       - "8080:80"     depends_on:       - mysql     volumes:       -  app-conf:/var/www/html/upload       -  app-conf:/var/www/html/config.php     environment:       DB_TYPE: mysql       DB_MANAGER: MysqlManager    mysql:     image: mysql:5.6     container_name: mysql     volumes:       - mysqldata:/var/lib/mysql     ports:       - 3306:3306     environment:       MYSQL_ROOT_PASSWORD:       MYSQL_DATABASE:       MYSQL_USER:       MYSQL_PASSWORD:  volumes:   mysqldata:   app-conf:

Which results in the error:

And I tried it with a given path, as a mounted volume.

/src/docker/myapp/upload:/var/www/html/upload /src/docker/myapp/upload:/var/www/html/config.php

However both ways are not working. With the mounted volume I see that upload gets created.

But then fails with

/var/www/html/config.php\\" caused \\"not a directory\\"\""

If I try it with /src/docker/myapp/upload/config.php:/var/www/html/config.php

Docker creates the upload folder and then a config.php folder. Not a file.

Or is there another way to persit the config?

回答1:

File volumes done this way in docker (absolute path example (can use env variables), and you need to mention the file name) :

    volumes:       - /src/docker/myapp/upload:/var/www/html/upload       - /src/docker/myapp/upload/config.php:/var/www/html/config.php

You can also do:

    volumes:       - ${PWD}/upload:/var/www/html/upload       - ${PWD}/upload/config.php:/var/www/html/config.php

If you fire the docker-compose from /src/docker/myapp folder



回答2:

I had been suffering from a similar issue. I was trying to import my config file to my container so that I can fix it every time I need without re-building the image.

I mean I thought the below command would import /root/app/config.py from the container into $(pwd)/config.py on Docker host as a file .

docker run -v $(pwd)/config.py:/root/app/config.py my_docker_image

However, it always created a directory named config.py not a file.

while looking for clue, I found the reason(from here)

If you use -v or --volume to bind-mount a file or directory that does not yet exist on the Docker host, -v will create the endpoint for you. It is always created as a directory.

As you can see, It is always created as a directory because my docker host does not have $(pwd)/config.py.

Even if I create config.py in docker host. $(pwd)/config.py just overwirte /root/app/config.py not exporting /root/app/config.py.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!