Estoy tratando de dockerizar una aplicación php. En el dockerfile descargo el archivo, lo extraigo, etc.
Todo funciona bien, sin embargo, si se lanza una nueva versión y actualizo el dockerfile, tengo que reinstalar la aplicación, porque se sobrescribe el config.php.
Así que pensé que podía montar el archivo como un volumen, como hago con la base de datos.
Lo intenté de dos maneras, con un volumen y una ruta directa.
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:
Lo que da como resultado el error:
Y lo probé con una ruta determinada, como un volumen montado.
/src/docker/myapp/upload:/var/www/html/upload
/src/docker/myapp/upload:/var/www/html/config.php
Sin embargo, ambas formas no funcionan. Con el volumen montado veo que se crea la carga.
Pero luego falla con
/var/www/html/config.php \\ "causó \\" no un directorio \\ "\" "
Si lo intento con
/src/docker/myapp/upload/config.php:/var/www/html/config.php
Docker crea la carpeta de carga y luego una carpeta config.php. No es un archivo
¿O hay otra forma de persistir la configuración?
fuente
Respuestas:
Los volúmenes de archivos se realizan de esta manera en Docker (ejemplo de ruta absoluta (puede usar variables env), y debe mencionar el nombre del archivo):
También puedes hacer:
Si disparas el docker-compose desde la
/src/docker/myapp
carpetafuente
Había estado sufriendo un problema similar. Intenté importar mi archivo de configuración a mi contenedor para poder arreglarlo cada vez que lo necesito sin reconstruir la imagen.
Quiero decir, pensé que el siguiente comando se asignaría
$(pwd)/config.py
desde el host Docker al/root/app/config.py
contenedor como un archivo.Sin embargo, siempre creaba un directorio llamado
config.py
, no un archivo.Mientras buscaba una pista, encontré la razón (desde aquí )
Por lo tanto, siempre se crea como un directorio porque mi host docker no tiene
$(pwd)/config.py
.Incluso si creo config.py en docker host.
$(pwd)/config.py
simplemente overwirte/root/app/config.py
no exportando/root/app/config.py
.fuente
touch path/to/file
en elDockerfile
para que cuando lo monte todavía sea un archivo (no un directorio creado):
tiene que ser camino completo. Funciona de esta maneratouch
respuesta fue la siguiente: hazlo en Dockerfile y luego tu montaje de volumen compuesto por docker funcionará correctamente sin crear un directorioUse mount (
--mount
) en lugar de volume (-v
)Más información: https://docs.docker.com/storage/bind-mounts/
Ejemplo:
Asegúrese de que /tmp/a.txt exista en el host de Docker
fuente
--mount
y-v
es el comportamiento cuando la parte del volumen del host aún no existe. Según su enlace:> Si usa -v o --volume para enlazar-montar un archivo o directorio que aún no existe en el host Docker, -v crea el punto final para usted. Siempre se crea como un directorio.Para cualquiera que use el contenedor de Windows como yo, sepa que NO PUEDE enlazar o montar archivos individuales usando el contenedor de Windows.
Es difícil de detectar, pero está ahí.
Enlace al problema de Github con respecto a la asignación de archivos en el contenedor de Windows
fuente
La forma en que funcionó para mí es usar una
bind
monturaGracias mike breed por la respuesta en: Montar un solo archivo desde el volumen usando docker-compose
Debe usar la "sintaxis larga" para expresar un
bind
montaje: https://docs.docker.com/compose/compose-file/#long-syntaxfuente
A partir de la versión 3.2 del archivo docker-compose, puede especificar un montaje de volumen de tipo "bind" (en lugar del tipo predeterminado "volumen") que le permite montar un solo archivo en el contenedor. Busque "montaje de enlace" en los documentos de volumen docker-compose: https://docs.docker.com/compose/compose-file/#volumes
En mi caso, estaba tratando de montar un solo archivo ".secrets" en mi aplicación que contenía secretos para el desarrollo local y las pruebas solamente. En producción, mi aplicación obtiene estos secretos de AWS.
Si monté este archivo como un volumen usando la sintaxis abreviada:
Docker crearía un directorio ".secrets" dentro del contenedor en lugar de asignarlo al archivo fuera del contenedor. Mi código generaría un error como "IsADirectoryError: [Errno 21] Es un directorio: '.secrets'".
Solucioné esto usando la sintaxis de mano larga en su lugar, especificando mi archivo de secretos usando un montaje de volumen de "lectura" de solo lectura:
Ahora Docker monta correctamente mi archivo .secrets en el contenedor, creando un archivo dentro del contenedor en lugar de un directorio. ¡Espero que otros encuentren útil este ejemplo!
fuente
También puede usar una ruta relativa a su
docker-compose.yml
archivo como esta (probado en el host de Windows, contenedor de Linux):fuente
version: '3.7'
especificado en eldocker-compose.yml
archivo con docker-compose versión 1.24.1, compilación 4667896b, y funcionó.Para mí, el problema era que tenía un enlace simbólico roto en el archivo que estaba tratando de montar en el contenedor
fuente
Yo tenía el mismo problema en Windows,
Docker 18.06.1-ce-win73 (19507)
.Al quitar y volver a agregar la unidad compartida a través del panel de configuración de Docker, todo volvió a funcionar.
fuente
En Windows, si necesita la variable env $ {PWD} env en su docker-compose.yml, puede crear un archivo .env en el mismo directorio que su archivo docker-compose.yml y luego insertar manualmente la ubicación de su carpeta.
CMD (pwd_var.bat):
Powershell (pwd_var.ps1):
Hay más características buenas para las variables .env de docker-compose: https://docs.docker.com/compose/reference/envvars/ especialmente para la
COMPOSE_CONVERT_WINDOWS_PATHS
variable env que permite que docker compose acepte la ruta de Windows con baskslash"\"
.Cuando desee compartir un archivo en Windows, el archivo debe existir antes de compartirlo con el contenedor.
fuente
Quizás esto ayude a alguien.
Tuve este problema y probé todo. Los enlaces de volumen se veían bien e incluso si monté el directorio (no los archivos), tenía los nombres de los archivos en el directorio montado correctamente pero los monté como directorios.
Intenté volver a habilitar las unidades compartidas y Docker se quejó de que el firewall está activo.
Después de deshabilitar el firewall, todo funcionaba bien.
fuente
Puede montar archivos o directorios / carpetas, todo depende del archivo o directorio fuente. Y también debe proporcionar una ruta completa o si no está seguro de poder usar PWD. Aquí hay un ejemplo de trabajo simple.
En este ejemplo, estoy montando el archivo env-command que ya existe en mi directorio de trabajo
fuente
Tengo el mismo problema en mi Windows 8.1
Resultó que se debió a la sensibilidad de mayúsculas y minúsculas de la ruta. Llamé
docker-compose up
desde el directoriocd /c/users/alex/
y dentro del contenedor un archivo se convirtió en directorio.Pero cuando lo hice
cd /c/Users/alex/
(no Usuarios en mayúscula) y llamédocker-compose up
desde allí, funcionó.En mi sistema, tanto el directorio de usuarios como el directorio de Alex están en mayúsculas, aunque parece que solo importa el directorio de usuarios.
fuente