tag run remove imagenes hub example docker docker-compose

run - download docker image



Cómo montar un solo archivo en un volumen (9)

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?


TL; DR / Aviso:

Si experimenta que se está creando un directorio en lugar del archivo que está intentando montar, probablemente no haya podido proporcionar una ruta válida y absoluta . Este es un error común con un modo de falla silencioso y confuso.

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):

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

También puedes hacer:

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

Si dispara el docker-compose desde la carpeta /src/docker/myapp


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):

echo PWD=%cd% >> .env

Powershell (pwd_var.ps1):

$PSDefaultParameterValues[''Out-File:Encoding''] = ''utf8''; echo "PWD=$(get-location).path" >> .env

Se escuchan más características buenas para las variables .env de docker-compose: https://docs.docker.com/compose/reference/envvars/ especialmente para la variable env COMPOSE_CONVERT_WINDOWS_PATHS que permite que COMPOSE_CONVERT_WINDOWS_PATHS compose acepte la ruta de Windows con la barra de herramientas "/" .

Cuando desee compartir un archivo en Windows, el archivo debe existir antes de compartirlo con el contenedor.


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 $(pwd)/config.py del host Docker a /root/app/config.py en el contenedor como un archivo.

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

Sin embargo, siempre creó un directorio llamado config.py , no un archivo.

Mientras buscaba una pista, encontré la razón (desde here )

Si utiliza -v o --volume para enlazar y montar un archivo o directorio que aún no existe en el host Docker, -v creará el punto final para usted. Siempre se crea como un directorio .

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 superpone /root/app/config.py no exporta /root/app/config.py .


Para cualquiera que use el contenedor de Windows como yo, sepa que NO PUEDE enlazar o montar archivos individuales usando el contenedor de Windows.

Los siguientes ejemplos fallarán al usar contenedores basados ​​en Windows, ya que el destino de un volumen o montaje de enlace dentro del contenedor debe ser uno de: un directorio no existente o vacío; o una unidad que no sea C :. Además, la fuente de un montaje de enlace debe ser un directorio local, no un archivo .

net use z: //remotemachine/share

docker run -vz:/foo:c:/dest ...

docker run -v //uncpath/to/directory:c:/dest ...

docker run -vc:/foo/somefile.txt:c:/dest ...

docker run -vc:/foo:c: ...

docker run -vc:/foo:c:/existing-directory-with-contents ...

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


Para mí, el problema era que tenía un enlace simbólico roto en el archivo que estaba tratando de montar en el contenedor


También puede usar una ruta relativa a su archivo docker-compose.yml como esta (probado en el host de Windows, contenedor de Linux):

volumes: - ./test.conf:/fluentd/etc/test.conf


Tengo el mismo problema en mi Windows 8.1

Resultó que se debía a la sensibilidad de mayúsculas y minúsculas de la ruta. Llamé a docker-compose up desde el directorio cd /c/users/alex/ y dentro del contenedor un archivo se convirtió en directorio.

Pero cuando hice cd /c/Users/alex/ (no Users 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 el directorio de usuarios es importante.


Tuve 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.


Use mount en lugar de volumen (-v) Más información: https://docs.docker.com/storage/bind-mounts/

Ejemplo: Asegúrese de que /tmp/a.txt exista en el host docker Docker run -it --mount type = bind, source = / tmp / a.txt, target = / root / a.txt alpine sh