Tengo una aplicación dockerizada que usa el sistema de archivos para almacenar muchos estados. El código de la aplicación está contenido en la imagen de la ventana acoplable.
Estoy considerando una estrategia de actualización que implica compartir el volumen entre dos contenedores, pero asegurándome de que, como máximo, un contenedor a la vez pueda escribir en ese sistema de archivos.
El flujo de trabajo sería:
Puede volver a montar su volumen desde el interior del contenedor, en el modo rw , así:
mount -o remount,rw /mnt/dataEl problema es que montar syscall no está permitido dentro de los contenedores de Docker de forma predeterminada, por lo que tendría que ejecutarlo en un modo privilegiado:
docker run --privileged ...o habilite la capacidad SYS_ADMIN
SYS_ADMIN Realiza una serie de operaciones de administración del sistema.
docker run --cap-add=SYS_ADMIN --security-opt apparmor:unconfined(Tenga en cuenta que también tuve que agregar --security-opt apparmor:unconfined, para que esto funcione en Ubuntu).
Además, volver a montar el volumen rw de nuevo a ro puede ser complicado, ya que es posible que algunos procesos ya hayan abierto algunos archivos dentro de él para escribir, en cuyo caso el remount fallará con el mensaje de error is busy .
Pero supongo que puede reiniciar el contenedor en su lugar (ya que sería el que ejecuta una versión anterior de la aplicación).
No es exactamente lo que solicitó el OP, pero tuve una pregunta similar en la que necesitaba obtener datos FUERA del contenedor en ejecución, pero había montado RW.
Otras formas de extraer los datos habrían llevado demasiado tiempo.
Mi acercamiento ? Guarde el contenedor como una imagen y comience un nuevo contenedor a partir de esa imagen con un montaje como RW: D
Comienzo inicial del contenedor:
docker run -p 80:8080 --mount type=bind,source="C:\data-folder-local\",target=/data-folder-container-ro,readonly -d imageName:imageTagHaciendo una imagen del contenedor. Puede detener este contenedor antes/después si lo desea.
docker commit -a "mud" -m "Damn, mount should be rw, stashing a snapshot to reuse." CONTAINER_ID_HERE snapshotImageName:snapshotImageTag donde CONTAINER_ID_HERE obtuve de la salida de docker ps ( https://docs.docker.com/engine/reference/commandline/ps/ )
Inicie un nuevo contenedor a partir de la imagen creada, ¡pero esta vez monte con derechos de escritura!
docker run -p 80:8080 --mount type=bind,source="C:\data-folder-local\",target=/data-folder-container-rw -d snapshotImageName:snapshotImageTagescriba archivos en la carpeta de montaje (en el sistema local) desde dentro de su contenedor: D
Espero que eso ayude a alguien.