I am trying 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 persist the config?
File volumes are 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
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 map $(pwd)/config.py
from Docker host to /root/app/config.py
into the container 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.
Therefore, 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
.
For me, the issue was that I had a broken symbolic link on the file I was trying to mount into the container
I have same issue on my Windows 8.1
It turned out that it was due to case-sensitivity of path.
I called docker-compose up
from directory cd /c/users/alex/
and inside container a file was turned into directory.
But when I did cd /c/Users/alex/
(not Users capitalized) and called docker-compose up
from there, it worked.
In my system both Users dir and Alex dir are capitalized, though it seems like only Users dir matter.
I had the same issue on Windows, Docker 18.06.1-ce-win73 (19507)
.
Removing and re-adding the shared drive via the Docker settings panel and everything worked again.