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 -d
todo 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> --automount
Entonces, 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.git
cd boot2docker
git -c core.autocrlf=false checkout v1.8.1
#o su versión apropiadarootfs/etc/rc.d/automount-shares
Agregue 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.iso
Esto 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.sh
método. Todo lo que puedo decir es que parece más limpio usar un comando de montaje como lo hicebootlocal.sh
en el perfil. Además, normalmente, creo queprofile
podrí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> pwd
use una herramienta de línea de comando como
rsync
copiar 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:/root
NB: 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.yml
archivo de.:/app
a/root/<name_of_folder>:/app
correr
docker-compose up -d
NB cuando los cambios se realizan localmente, no olvide volver a ejecutar
rsync
a 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 255
y tengo que recrear completamente la máquina.docker 1.10
y endocker-machine 0.6.0
gist.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
HOST
blanco: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 VirtualBox
administrador 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 ...
default
VM a través de la línea de comando oD:\Projects\MyProject\db
=>/var/db
En
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 default
para reiniciar la VM.cd D:\Projects\MyProject\
docker-compose up
deberí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.yml
pero 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.yml
archivo (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:/data
Esto se rompe por dos razones ...
D:
unidad\
caracteresdocker-compose
los agrega y luego te culpa por ello !!COMPOSE_CONVERT_WINDOWS_PATHS=0
para detener esta tontería.Recomiendo documentar su mapeo de carpeta compartida de VM adicional en su
docker-compose.yml
archivo, 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:\Users
como carpeta compartida/c/Users
en la máquina virtual de Linux (utilizando la función de carpetas compartidas de Virtual Box), por lo que si sudocker-compose.yml
archivo 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-project
y 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 ssh
y 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:\Users
ruta. Por ejemplo, si pones lo mismodocker-compose.yml
debajoD:\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 Folders
sección y agregue la nueva carpeta compartida:D:\dev
d/dev
Presione
OK
dos veces y cierre la GUI de Virtual Box.docker-machine start
).Eso es todo. Todas las rutas de la máquina host debajo
D:\dev
deberían funcionar ahora endocker-compose.yml
montajes.fuente
Puede ser combinado bruja hecho de tres herramientas:
docker-machine mount
,rsync
,inotifywait
Digamos que tienes tu
docker-compose.yml
yrun_web.sh
en/home/jdcaballerov/web
docker-machine machine:/home/jdcaballerov/web /tmp/some_random_dir
rsync -r /home/jdcaballerov/web /tmp/some_random_dir
Sincronice 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.sh
archivo está en el mismo directorio que sudocker-compose.yml
archivo. Entonces el comando debería sercommand: /app/run_web.sh
.A menos
Dockerfile
que (que no está revelando) se encargue de colocar elrun_web.sh
archivo 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