Estoy tratando de usar docker-machine con docker-compose. El archivo docker-compose.yml tiene las siguientes definiciones:
web:
build: .
command: ./run_web.sh
volumes:
- .:/app
ports:
- "8000:8000"
links:
- db:db
- rabbitmq:rabbit
- redis:redis
Al ejecutar docker-compose up -dtodo va bien hasta intentar ejecutar el comando y se produce un error:
No se puede iniciar el contenedor b58e2dfa503b696417c1c3f49e2714086d4e9999bd71915a53502cb6ef43936d: [8] Error del sistema: exec: "./run_web.sh": stat ./run_web.sh: no existe ese archivo o directorio
Los volúmenes locales no están montados en la máquina remota. ¿Cuál es la estrategia recomendada para montar los volúmenes locales con el código de las aplicaciones web?
docker
dockerfile
docker-compose
jdcaballerov
fuente
fuente

Respuestas:
Docker-machine monta automáticamente el directorio de usuarios ... Pero a veces eso no es suficiente.
No sé sobre docker 1.6, pero en 1.8 PUEDES agregar un soporte adicional a docker-machine
Agregar punto de montaje de máquina virtual (parte 1)
CLI : (solo funciona cuando la máquina está parada)
VBoxManage sharedfolder add <machine name/id> --name <mount_name> --hostpath <host_dir> --automountEntonces, un ejemplo en Windows sería
GUI : (NO requiere que la máquina se detenga)
<machine name>(predeterminado)<host dir>(e :)<mount name>(e)Montaje en boot2docker (parte 2)
Montar manualmente en boot2docker :
docker-machine ip default, etc.sudo mkdir -p <local_dir>sudo mount -t vboxsf -o defaults,uid=`id -u docker`,gid=`id -g docker` <mount_name> <local_dir>Pero esto solo es bueno hasta que reinicia la máquina, y luego se pierde el soporte ...
Añadiendo un montaje automático a boot2docker :
Mientras está conectado a la máquina
/mnt/sda1/var/lib/boot2docker/bootlocal.sh, sda1 puede ser diferente para usted ...Añadir
Con estos cambios, debería tener un nuevo punto de montaje. Este es uno de los pocos archivos que pude encontrar que se llama al arrancar y es persistente. Hasta que haya una solución mejor, esto debería funcionar.
Método antiguo: menos recomendado , pero dejado como alternativa
/mnt/sda1/var/lib/boot2docker/profile, sda1 puede ser diferente para usted ...Añadir
Como último recurso , puede tomar la alternativa un poco más tediosa y puede modificar la imagen de arranque.
git -c core.autocrlf=false clone https://github.com/boot2docker/boot2docker.gitcd boot2dockergit -c core.autocrlf=false checkout v1.8.1#o su versión apropiadarootfs/etc/rc.d/automount-sharesAgregue una
try_mount_share <local_dir> <mount_name>línea justo antes de fi al final. Por ejemploSolo asegúrese de no configurar nada que el sistema operativo necesite, como / bin, etc.
docker build -t boot2docker .# Esto tomará aproximadamente una hora la primera vez :(docker run --rm boot2docker > boot2docker.isoEsto funciona, es largo y complicado
docker versión 1.8.1, docker-machine versión 0.4.0
fuente
/mnt/sda1/var/lib/boot2docker/profile, ¿puede explicar por qué cambió al uso/mnt/sda1/var/lib/boot2docker/bootlocal.sh? Además, tachar todo este texto no contribuye a la legibilidad de su respuesta ;-)bootlocal.shmétodo. Todo lo que puedo decir es que parece más limpio usar un comando de montaje como lo hicebootlocal.shen el perfil. Además, normalmente, creo queprofilepodría ejecutarse varias veces, y una montura solo necesita ejecutarse una vez, por lo que tiene más sentido. Pero ambos pueden funcionar.También encontré este problema y parece que los volúmenes locales no se montan cuando se usa docker-machine. Una solución de pirateo es
obtener el directorio de trabajo actual de la instancia docker-machine
docker-machine ssh <name> pwduse una herramienta de línea de comando como
rsynccopiar la carpeta al sistema remotoEl pwd predeterminado es / root, por lo que el comando anterior sería
rsync -avzhe ssh --progress <name_of_folder> username@remote_ip:/rootNB: deberá proporcionar la contraseña del sistema remoto. Puede crear uno rápidamente mediante ssh en el sistema remoto y crear una contraseña.
cambie el punto de montaje del volumen en su
docker-compose.ymlarchivo de.:/appa/root/<name_of_folder>:/appcorrer
docker-compose up -dNB cuando los cambios se realizan localmente, no olvide volver a ejecutar
rsynca para enviar los cambios al sistema remoto.No es perfecto pero funciona. Hay un problema en curso https://github.com/docker/machine/issues/179
Otro proyecto que intenta resolver esto incluye docker-rsync
fuente
exit status 255y tengo que recrear completamente la máquina.docker 1.10y endocker-machine 0.6.0gist.github.com/cristobal/fcb0987871d7e1f7449ePor el momento, realmente no veo ninguna forma de montar volúmenes en las máquinas, por lo que el enfoque ahora sería copiar o sincronizar de alguna manera los archivos que necesita en la máquina.
Hay conversaciones sobre cómo resolver este problema en el repositorio de github de la máquina docker. Alguien hizo una solicitud de extracción implementando scp en docker-machine y ya está fusionado en master, por lo que es muy probable que la próxima versión lo incluya.
Dado que aún no se ha lanzado, a estas alturas recomendaría que si tiene su código alojado en github, simplemente clone su repositorio antes de ejecutar la aplicación
Actualización: mirando más allá, descubrí que la función ya está disponible en los últimos binarios , cuando los obtenga, podrá copiar su proyecto local ejecutando un comando como este:
Siendo esta la forma general:
Para que pueda copiar archivos desde, hacia y entre máquinas.
¡Salud! 1
fuente
Desde octubre de 2017, hay un nuevo comando para docker-machine que hace el truco, pero asegúrese de que no haya nada en el directorio antes de ejecutarlo, de lo contrario podría perderse:
docker-machine mount <machine-name>:<guest-path> <host-path>Consulte los documentos para obtener más información: https://docs.docker.com/machine/reference/mount/
PR con el cambio: https://github.com/docker/machine/pull/4018
fuente
...:<guest-path> <host-path>(en lugar de al revés). Algo tan simple y crítico para tener en cuenta en la documentación ... ¡simplemente no lo es!Si elige la opción rsync con docker-machine, puede combinarla con el
docker-machine ssh <machinename>comando de esta manera:rsync -rvz --rsh='docker-machine ssh <machinename>' --progress <local_directory_to_sync_to> :<host_directory_to_sync_to>Utiliza este formato de comando de rsync, dejando en
HOSTblanco:rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST( http://linuxcommand.org/man_pages/rsync1.html )
fuente
Finalmente descubrí cómo actualizar Windows Docker Toolbox a v1.12.5 y mantener mis volúmenes funcionando agregando una carpeta compartida en el
Oracle VM VirtualBoxadministrador y deshabilitando la conversión de ruta. Si tiene Windows 10+, es mejor usar el Docker más nuevo para Windows.Primero el dolor de actualización:
Ejemplo de base de datos de Redis:
redis: image: redis:alpine container_name: redis ports: - "6379" volumes: - "/var/db/redis:/data:rw"En la terminal de inicio rápido de Docker ...
docker-machine stop default: asegúrese de que la máquina virtual sea transportadaEn Oracle VM VirtualBox Manager ...
defaultVM a través de la línea de comando oD:\Projects\MyProject\db=>/var/dbEn
docker-compose.yml..."/var/db/redis:/data:rw"En la terminal de inicio rápido de Docker ...
COMPOSE_CONVERT_WINDOWS_PATHS=0(para la versión de Toolbox> = 1.9.0)docker-machine start defaultpara reiniciar la VM.cd D:\Projects\MyProject\docker-compose updebería funcionar ahora.Ahora crea la base de datos redis en
D:\Projects\MyProject\db\redis\dump.rdb¿Por qué evitar rutas de host relativas?
Yo evitaba caminos de acogida relativas para Windows Caja de herramientas, ya que pueden introducir no válidos '\' caracteres. No es tan agradable como usar rutas relativas a,
docker-compose.ymlpero al menos mis compañeros desarrolladores pueden hacerlo fácilmente incluso si la carpeta de su proyecto está en otro lugar sin tener que piratear eldocker-compose.ymlarchivo (malo para SCM).Emisión original
FYI ... Aquí está el error original que obtuve cuando usé buenas rutas relativas limpias que solían funcionar bien para versiones anteriores. Mi mapeo de volumen solía ser solo
"./db/redis:/data:rw"ERROR: for redis Cannot create container for service redis: Invalid bind mount spec "D:\\Projects\\MyProject\\db\\redis:/data:rw": Invalid volume specification: 'D:\Projects\MyProject\db\redis:/dataEsto se rompe por dos razones ...
D:unidad\caracteresdocker-composelos agrega y luego te culpa por ello !!COMPOSE_CONVERT_WINDOWS_PATHS=0para detener esta tontería.Recomiendo documentar su mapeo de carpeta compartida de VM adicional en su
docker-compose.ymlarchivo, ya que es posible que deba desinstalar VirtualBox nuevamente y restablecer la carpeta compartida y, de todos modos, sus compañeros desarrolladores lo amarán por ello.fuente
Todas las demás respuestas eran buenas para el momento, pero ahora (Docker Toolbox v18.09.3) todo funciona de inmediato. Solo necesita agregar una carpeta compartida en VirtualBox VM.
Docker Toolbox se agrega automáticamente
C:\Userscomo carpeta compartida/c/Usersen la máquina virtual de Linux (utilizando la función de carpetas compartidas de Virtual Box), por lo que si sudocker-compose.ymlarchivo se encuentra en algún lugar debajo de esta ruta y monta los directorios de la máquina host solo en esta ruta, todo debería funcionar de inmediato.Por ejemplo:
C:\Users\username\my-project\docker-compose.yml:La
.ruta se convertirá automáticamente en ruta absolutaC:\Users\username\my-projecty luego en/c/Users/username/my-project. Y así es exactamente como se ve esta ruta desde el punto de vista de la máquina virtual linux (puede verificarlo:docker-machine sshy luegols /c/Users/username/my-project). Entonces, el montaje final será/c/Users/username/my-project:/app.Todo funciona de forma transparente para ti.
Pero esto no funciona si la ruta de montaje de su host no está debajo de la
C:\Usersruta. Por ejemplo, si pones lo mismodocker-compose.ymldebajoD:\dev\my-project.Sin embargo, esto se puede solucionar fácilmente.
docker-machine stop).Abra la GUI de Virtual Box, abra la Configuración de la máquina virtual nombrada
default, abra laShared Folderssección y agregue la nueva carpeta compartida:D:\devd/devPresione
OKdos veces y cierre la GUI de Virtual Box.docker-machine start).Eso es todo. Todas las rutas de la máquina host debajo
D:\devdeberían funcionar ahora endocker-compose.ymlmontajes.fuente
Puede ser combinado bruja hecho de tres herramientas:
docker-machine mount,rsync,inotifywaitDigamos que tienes tu
docker-compose.ymlyrun_web.shen/home/jdcaballerov/webdocker-machine machine:/home/jdcaballerov/web /tmp/some_random_dirrsync -r /home/jdcaballerov/web /tmp/some_random_dirSincronice cada cambio de archivos en su directorio:
TENGA EN CUENTA : hay dos directorios que tienen la misma ruta: uno está en su máquina local (host), el segundo está en la máquina acoplable.
fuente
Supongo que el
run_web.sharchivo está en el mismo directorio que sudocker-compose.ymlarchivo. Entonces el comando debería sercommand: /app/run_web.sh.A menos
Dockerfileque (que no está revelando) se encargue de colocar elrun_web.sharchivo en la imagen de Docker.fuente
Después de resumir las publicaciones aquí, adjunte el script actualizado, para crear un punto de montaje de host adicional y un montaje automático cuando se reinicie Virtualbox. El resumen del entorno de trabajo es el siguiente: - Windows 7 - docker-machine.exe versión 0.7.0 - VirtualBox 5.0.22
fuente
Estoy usando docker-machine 0.12.2 con la unidad virtualbox en mi máquina local. Descubrí que hay un directorio
/hosthome/$(user name)desde donde tiene acceso a los archivos locales.fuente
Solo pensé en mencionar que he estado usando 18.03.1-ce-win65 (17513) en Windows 10 y noté que si anteriormente compartió una unidad y guardó las credenciales en caché, una vez que cambie su contraseña, la ventana acoplable comenzará a tener los volúmenes montados dentro de los contenedores como en blanco.
No da ninguna indicación de que lo que realmente está sucediendo es que ahora no puede acceder a las credenciales compartidas con las antiguas en caché. La solución en este escenario es restablecer las credenciales a través de la interfaz de usuario (Configuración-> Unidades compartidas) o deshabilitar y luego renombrar el uso compartido de unidades e ingresar la nueva contraseña.
Sería útil si docker-compose mostrara un error en estas situaciones.
fuente