Я пытаюсь докеризировать приложение php. В докерфайле скачиваю архив, распаковываю его и т. Д.
Все работает нормально, однако, если выходит новая версия, и я обновляю dockerfile, мне нужно переустановить приложение, потому что config.php перезаписывается.
Поэтому я подумал, что могу смонтировать файл как том, как я делаю с базой данных.
Я попробовал это двумя способами, с объемом и прямым путем.
докер-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:
Что приводит к ошибке:
И я попробовал это с заданным путем, как смонтированный том.
/src/docker/myapp/upload:/var/www/html/upload
/src/docker/myapp/upload:/var/www/html/config.php
Однако оба способа не работают. С подключенным томом я вижу, что загрузка создана.
Но тогда терпит неудачу с
/var/www/html/config.php \\ "вызвал \\" не каталог \\ "\" "
Если я попробую это с
/src/docker/myapp/upload/config.php:/var/www/html/config.php
Docker создает папку загрузки, а затем папку config.php. Не файл
Или есть другой способ сохранить конфиг?
источник
Ответы:
Тома файлов создаются таким образом в Docker (пример абсолютного пути (можно использовать переменные env), и вам необходимо указать имя файла):
Вы также можете сделать:
Если вы запускаете docker-compose из
/src/docker/myapp
папкиисточник
Я страдал от подобной проблемы. Я пытался импортировать мой файл конфигурации в свой контейнер, чтобы я мог исправить это каждый раз, когда мне нужно, без перекомпоновки изображения.
Я имею в виду, что я думал, что приведенная ниже команда отобразит
$(pwd)/config.py
хост Docker/root/app/config.py
в контейнер в виде файла.Тем не менее, он всегда создавал каталог с именем
config.py
, а не файл.в поисках подсказки я нашел причину ( отсюда )
Поэтому он всегда создается как каталог, потому что мой докер хост не имеет
$(pwd)/config.py
.Даже если я создаю config.py в хосте Docker.
$(pwd)/config.py
просто перезапись/root/app/config.py
не экспортируется/root/app/config.py
.источник
touch path/to/file
вDockerfile
так, чтобы, когда я монтировал, это все еще был файл (не созданный dir):
должна быть на полном пути. Это работает таким образомtouch
Был ответ, сделать это в Dockerfile тогда ваш докер-Compose монтирования тома будет корректно работать без создания каталогаИспользуйте mount (
--mount
) вместо тома (-v
)Дополнительная информация: https://docs.docker.com/storage/bind-mounts/
Пример:
Убедитесь, что /tmp/a.txt существует на хосте докера
источник
--mount
и-v
заключается в поведении, когда основная часть тома еще не существует. По вашей ссылке:> Если вы используете -v или --volume для привязки-монтирования файла или каталога, которого еще нет на хосте Docker, -v создаст для вас конечную точку. Он всегда создается как каталог.Для любого, кто использует контейнер Windows, такой как я, знайте, что вы НЕ МОЖЕТЕ связывать или монтировать отдельные файлы, используя контейнер Windows.
Это трудно заметить, но это там
Ссылка на проблему Github относительно отображения файлов в контейнер Windows
источник
Способ, который работал для меня, это использовать
bind
креплениеСпасибо Майку Породе за ответ по адресу: Монтирование отдельного файла из тома с помощью docker-compose.
Вам нужно использовать «длинный синтаксис» для выражения
bind
монтирования: https://docs.docker.com/compose/compose-file/#long-syntaxисточник
Начиная с версии 3.2 файла docker-compose вы можете указать монтирование тома типа «bind» (вместо типа по умолчанию «том»), которое позволяет монтировать один файл в контейнер. Ищите «bind mount» в документации тома docker-compose: https://docs.docker.com/compose/compose-file/#volumes
В моем случае я пытался подключить в приложение один файл «.secrets», который содержал секреты только для локальной разработки и тестирования. Вместо этого мое приложение извлекает эти секреты из AWS.
Если я смонтировал этот файл как том, используя сокращенный синтаксис:
Docker бы создать «.secrets» каталог внутри контейнера вместо отображения в файл снаружи контейнера. Мой код будет вызывать ошибку, такую как «IsADirectoryError: [Errno 21] Является каталогом:« .secrets »».
Я исправил это, используя вместо этого длинный синтаксис, указав мой файл секретов с помощью монтируемого только для чтения тома «bind»:
Теперь Docker правильно монтирует мой файл .secrets в контейнер, создавая файл внутри контейнера вместо каталога. Надеюсь, что другие найдут этот пример полезным!
источник
Вы также можете использовать относительный путь к вашему
docker-compose.yml
файлу, как это (проверено на хосте Windows, контейнере Linux):источник
version: '3.7'
указанным вdocker-compose.yml
файле с версией docker-compose 1.24.1, сборка 4667896b, и это сработало.Для меня проблема была в том, что у меня была битая символическая ссылка на файл, который я пытался смонтировать в контейнер
источник
У меня была такая же проблема на Windows
Docker 18.06.1-ce-win73 (19507)
.Извлечение и повторное добавление общего диска через панель настроек Docker, и все снова заработало.
источник
В Windows, если вам нужна переменная $ {PWD} env в вашем docker-compose.yml, вы можете создать файл .env в той же директории, что и ваш файл docker-compose.yml, а затем вставить вручную местоположение вашей папки.
CMD (pwd_var.bat):
Powershell (pwd_var.ps1):
Есть и другие полезные функции для docker-compose переменных .env: https://docs.docker.com/compose/reference/envvars/, особенно для
COMPOSE_CONVERT_WINDOWS_PATHS
переменной env, которые позволяют docker compose принимать путь к Windows с помощью baskslash"\"
.Если вы хотите поделиться файлом в Windows, файл должен существовать, прежде чем делиться им с контейнером.
источник
Может быть, это кому-то помогает.
У меня была эта проблема и все перепробовал. Привязки томов выглядели хорошо, и даже если я смонтировал каталог (не файлы), у меня были правильные имена файлов в смонтированном каталоге, но они были смонтированы как каталоги.
Я попытался повторно включить общие диски, и Докер пожаловался, что брандмауэр активен.
После отключения брандмауэра все работало нормально.
источник
Вы можете монтировать файлы или каталоги / папки, все зависит от исходного файла или каталога. А также вам нужно указать полный путь или, если вы не уверены, что можете использовать PWD. Вот простой рабочий пример.
В этом примере я монтирую файл команд env, который уже существует в моем рабочем каталоге
источник
У меня такая же проблема на моей Windows 8.1
Оказалось, что это связано с регистрозависимостью пути. Я звонил
docker-compose up
из справочникаcd /c/users/alex/
и внутри контейнера файл был превращен в каталог.Но когда я сделал
cd /c/Users/alex/
(не пользователи заглавными буквами) и позвонилdocker-compose up
оттуда, это сработало.В моей системе оба пользователя dir и Alex dir пишутся с большой буквы, хотя кажется, что значение имеет только Users dir.
источник