2017-02-15 22 views
19

Jestem całkiem nowy dla dockera, a niektóre koncepcje woluminów są dla mnie dość mylące.Jak zamontować pojedynczy plik w woluminie

Próbuję dokować aplikację do php. W pliku dokowanym pobieram archiwum, rozpakowuję je itp.

Wszystko działa dobrze, jednak jeśli zostanie wydana nowa wersja, a ja aktualizuję plik dockerfile, muszę ponownie zainstalować aplikację, ponieważ config.php zostanie nadpisany.

Więc pomyślałem, że mogę zamontować plik jako wolumin, tak jak robię to z bazą danych.

Próbowałem go na dwa sposoby, z objętością i bezpośrednią ścieżką.

doker-komponować:

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: 

co prowadzi do błędu:

Próbowałem go z danej ścieżki, jako wolumin.

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

Jednak oba sposoby nie działają. Dzięki zamontowanemu tomowi widzę, że przesyłanie zostanie utworzone.

Ale nie z

/var/www/html/config.php \\”spowodowane \\ "nie jest katalogiem \\" \ ""

Gdy próbuję go/src/Robotnik/myapp/upload/config.php: /var/www/html/config.php

Docker tworzy folder przesyłania, a następnie folder config.php nie plik

Czy jest jakiś inny sposób.. aby sprawdzić konfigurację?

Odpowiedz

35

objętości pliku odbywa się w ten sposób w Docker (absolutnej przykład ścieżki (można używać zmiennych env), a trzeba wspomnieć nazwy pliku):

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

Można również zrobić:

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

Jeśli odpal doker-compose z /src/docker/myapp folder

+12

Tak jak mówiłem, jeśli staram /src/docker/myapp/upload/config.php:/var/www/html/config.php Docker tworzy folder przesyłania, a następnie folder config.php. Nie plik. –

+4

W swoim wpisie napisałeś inaczej. Jeśli plik istnieje, powinien zostać zamontowany jako plik. – BlackStork

+0

https://docs.docker.com/engine/tutorials/dockervolumes/#/mount-a-host-file-as-a-data-volume <- powinien działać bez zarzutu – BlackStork

9

Cierpiałem na podobny problem. Próbowałem zaimportować plik konfiguracyjny do mojego kontenera, aby móc go naprawić za każdym razem, gdy potrzebuję, bez ponownego budowania obrazu.

Mam na myśli Myślałem, że poniższe polecenie zaimportuje /root/app/config.py z kontenera do $(pwd)/config.py na hoście Docker jako plik.

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

Jednak zawsze tworzył katalog o nazwie config.py zamiast pliku.

patrząc na trop, znalazłem przyczynę (od 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.

Jak widać, to zawsze jest stworzony jako katalog ponieważ mój gospodarz doker nie posiada $(pwd)/config.py.

Nawet jeśli utworzę config.py w hoście dokera. $(pwd)/config.py po prostu overwirte /root/app/config.py nie eksportować /root/app/config.py.

+2

Właśnie dodałem 'ścieżkę dotyku/do/pliku' w' Dockerfile'to że po zamontowaniu to nadal będzie plik (nie utworzony katalog) – shadi

Powiązane problemy