TransWikia.com

Error al guardar un archivo txt en R a través del docker

Stack Overflow en español Asked on August 27, 2021

Estoy intentando guardar un archivo .txt de una sesión de R que se ejecuta a través del docker.
Para ejecutar esta imagen de docker corre el siguiente código:

     docker run -e PASSWORD=xxx --rm -p xxx:xxx -v ~/ad_R:/home/rstudio/ad_R -v ~/ad_data:/home/rstudio/ad_data rocker/tidyverse

No muestro por aquí la contraseña ni el puerto en el que se ejecutan.

No obstante mi pregunta es, cuando ejecuto el siguiente código:

     write.table(all_blast_vir_updated,file="/home/rstudio/ad_R/all_blast_vir_updated.txt",sep="t")

Me da este error:

     Error in file(file, ifelse(append, "a", "w")) : 
     cannot open the connection
     In addition: Warning message:
     In file(file, ifelse(append, "a", "w")) :
     cannot open file '/home/rstudio/ad_R/all_blast_vir_updated.txt': Permission denied

cuando corro el siguiente código en la terminal de R:

system('ls -ld ad_R;ls -ld ad_data')

obtengo el siguiente resultado:

   drwxr-xr-x 3 root root 4096 Jul  9 10:06 ad_R
   drwxr-xr-x 1 root root 516 Jul  6 15:06 ad_data


    docker inspect rocker/tidyverse

    [
{
    "Id": "sha256:93f0dfaee7413331b085e3353ecfd99de4c95a3c38344f367a1e20938f350a94",
    "RepoTags": [
        "rocker/tidyverse:latest"
    ],
    "RepoDigests": [
        "rocker/tidyverse@sha256:0fcc86754ed90b3e5a3dcaed27ad967de2859705f85c28d9284e16aa9856548b"
    ],
    "Parent": "",
    "Comment": "",
    "Created": "2018-10-16T05:21:13.292396576Z",
    "Container": "a3083823beca98108c9b0239bd26453dba04d2ffd7aabb002e3c4d4ce26e0865",
    "ContainerConfig": {
        "Hostname": "",
        "Domainname": "",
        "User": "",
        "AttachStdin": false,
        "AttachStdout": false,
        "AttachStderr": false,
        "ExposedPorts": {
            "8787/tcp": {}
        },
        "Tty": false,
        "OpenStdin": false,
        "StdinOnce": false,
        "Env": [
            "PATH=/usr/lib/rstudio-server/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
            "R_VERSION=3.5.1",
            "LC_ALL=en_US.UTF-8",
            "LANG=en_US.UTF-8",
            "TERM=xterm",
            "S6_VERSION=v1.21.4.0",
            "S6_BEHAVIOUR_IF_STAGE2_FAILS=2"
        ],
        "Cmd": [
            "/bin/sh",
            "-c",
            "apt-get update -qq && apt-get -y --no-install-recommends install   libxml2-dev   libcairo2-dev   libsqlite3-dev   libmariadbd-dev   libmariadb-client-lgpl-dev   libpq-dev   libssh2-1-dev   unixodbc-dev   && install2.r --error     --deps TRUE     tidyverse     dplyr     devtools     formatR     remotes     selectr     caTools     BiocManager"
        ],
        "ArgsEscaped": true,
        "Image": "sha256:21494863674fd4db806d16b96ff96e35a960dae5883ecf73a9bb343584beb822",
        "Volumes": {
            "/home/rstudio/kitematic": {}
        },
        "WorkingDir": "",
        "Entrypoint": null,
        "OnBuild": null,
        "Labels": {
            "maintainer": "Carl Boettiger <[email protected]>",
            "org.label-schema.license": "GPL-2.0",
            "org.label-schema.vcs-url": "https://github.com/rocker-org/rocker-versioned",
            "org.label-schema.vendor": "Rocker Project"
        }
    },
    "DockerVersion": "18.03.1-ee-3",
    "Author": "",
    "Config": {
        "Hostname": "",
        "Domainname": "",
        "User": "",
        "AttachStdin": false,
        "AttachStdout": false,
        "AttachStderr": false,
        "ExposedPorts": {
            "8787/tcp": {}
        },
        "Tty": false,
        "OpenStdin": false,
        "StdinOnce": false,
        "Env": [
            "PATH=/usr/lib/rstudio-server/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
            "R_VERSION=3.5.1",
            "LC_ALL=en_US.UTF-8",
            "LANG=en_US.UTF-8",
            "TERM=xterm",
            "S6_VERSION=v1.21.4.0",
            "S6_BEHAVIOUR_IF_STAGE2_FAILS=2"
        ],
        "Cmd": [
            "/init"
        ],
        "ArgsEscaped": true,
        "Image": "sha256:21494863674fd4db806d16b96ff96e35a960dae5883ecf73a9bb343584beb822",
        "Volumes": {
            "/home/rstudio/kitematic": {}
        },
        "WorkingDir": "",
        "Entrypoint": null,
        "OnBuild": null,
        "Labels": {
            "maintainer": "Carl Boettiger <[email protected]>",
            "org.label-schema.license": "GPL-2.0",
            "org.label-schema.vcs-url": "https://github.com/rocker-org/rocker-versioned",
            "org.label-schema.vendor": "Rocker Project"
        }
    },
    "Architecture": "amd64",
    "Os": "linux",
    "Size": 1809809643,
    "VirtualSize": 1809809643,
    "GraphDriver": {
        "Data": null,
        "Name": "aufs"
    },
    "RootFS": {
        "Type": "layers",
        "Layers": [
            "sha256:f715ed19c28b66943ac8bc12dbfb828e8394de2530bbaf1ecce906e748e4fdff",
            "sha256:3f4e4e58bfe2eb291704c6d4f0290cbef16f186782c91874603b329f8b4fcdeb",
            "sha256:3464d59c63ca738b514b2326b9ab5ae1f98ce1d745b0550c8ef8575dea82e468",
            "sha256:361124d095ab256af24832a87dc2a8284093131f0883b139cce71880a2b4cbbb",
            "sha256:d765234a779c9d92af39bdc0520bfffb0ccbcd7818fc22078b1fd6c6fedc4fd0",
            "sha256:d04dffe8baa928e83dd2f27bf565178b9e05bcb32887c8cfdb13141d6bd16fee",
            "sha256:f7f8979b332ebb6b415039d555c4a3d0e29977eb8b4686dafd057763e1efac41",
            "sha256:32d792b4b56e294f7e75dd76f7d6f546881996231016a26835594aa6a9112824"
        ]
    },
    "Metadata": {
        "LastTagTime": "0001-01-01T00:00:00Z"
    }
}

]

¿Cuál es mi problema?

2 Answers

Tienes un problema de permisos en las carpetas que mencionas, tienen un dueño, que no es el mismo con el que estás ejecutando la instancia de Rstudio con docker, de ahí el error de permisos al salvar. Esto lo puedes verificar mediante :

# ls -ld ad_R
               

Primero una explicación de permisos, ownership y otros temas: Understanding Basic File Permissions and ownership in Linux

introducir la descripción de la imagen aquí

Según comentaste, una de tu carpetas arroja esta información:

drwxr-xr-x 3 root root 4096 Jul  9 10:06 ad_R

El permiso es bastante común, le da privilegios de lectura, escritura y ejecución, al dueño de la carpeta y le quita la posibilidad de escritura al resto de los usuarios que forman parte del mismo grupo del dueño o a los otros (los que no son el dueño o parte del grupo del dueño).

Cualquier usuario que no sea el dueño, podrá ver el contenido de la carpeta pero no podrá salvar nada en ella. En este caso, el dueño, es el super usuario root, algo "extraño" ya que en el home de un usuario no root uno esperaría ver que el dueño de las carpetas es el propio usuario, esto me hace pensar que la creación de estas carpetas las hizo directamente el root

Finalmente vale decir que si no eres root no tendrás posibilidad de salvar nada en estas carpetas, no es un problema de docker, es un problema de permisos a nivel del SO, lo cual puedes verificar simplemente intentando crear cualquier contenido:

touch ~/ad_R/prueba.txt

~ es el alias del home del usuario activo. Deberías obtener un error similar a esto:

touch: no se puede efectuar `touch' sobre '/home/tu_home/prueba.txt': Permiso denegado

¿Y cómo lo solucionamos?

Depende de lo que el sistema te permita hacer, acá van una serie de opciones:

Trabajar con un usuario común No root

Esto es lo mejor y habitual en entornos linux, cuando ingresas al servidor, lo haces mediante un usuario, que siempre podrás consultar mediante whoami. Salvo que la instalación sea una catástrofe, deberías poder crear carpetas nuevas y estas heredar tu "ownership", por lo que debería funcionar algo así:

mkdir ~/ad_R_nuevo
mkdir ~/ad_data_nuevo

docker run -e PASSWORD=xxx --rm -p xxx:xxx -v ~/ad_R_nuevo:/home/rstudio/ad_R -v ~/ad_data_nuevo:/home/rstudio/ad_data rocker/tidyverse

En este caso "mapeamos" las carpetas nuevas a los nombres de volúmenes que ya manejabas, no tiene que ser necesariamente el mismo nombre de la carpeta física. Esto debería permitirte salvar en ad_R y ad_data.

Trabajar directamente como root

No es lo mejor, pero si es posible iniciar una sesión directamente como root, es raro, por que tu usuario y carpeta home es otro, pero si quieres seguir usando las carpetas ya creadas esta es una forma.

(a). Puedes iniciar la sesión directamente como root y luego ir a la carpeta de trabajo, por ejemplo: cd /home/lab227

(b). Puedes iniciar tu sesión normalmente y luego impersonarte como root mediante el comando su, ingresas la contraseña y listo. Verifica que seas efectivamente el superusuario mediante whoami

De cualquiera de las formas, ahora eres el dueño de las carpetas, deberías iniciar la instancia de docker como lo haces y no tener más problemas (al menos este).

(c) Puedes correr un comando desde un usuario común, pero, como root, por ejemplo, usando sudo:

sudo docker run -e PASSWORD=xxx --rm -p xxx:xxx -v ~/ad_R_nuevo:/home/rstudio/ad_R -v ~/ad_data_nuevo:/home/rstudio/ad_data rocker/tidyverse

¿Y no podemos cambiar el ownership de las carpetas?

Si, también es posible pero claramente lo tiene que hacer el super usuario o el dueño (en este caso el mismo), el dueño lo cambias así, en este caso logeado como el usuario común:

sudo chown -R $USER:$USER ~/ad_R
sudo chown -R $USER:$USER ~/ad_data

En este caso $USER es el alias del usuario activo. Luego puede verificar los permisos, por ejemplo si tu usuario es lab227:

 ls -ld ~/ad_R
 ls -ld ~/ad_data

Debieras tener una salida como esta:

 drwxr-xr-x 3 lab227 lab227 4096 Jul  9 10:06 ad_R

 drwxr-xr-x 3 lab227 lab227 4096 Jul  9 10:06 ad_data

Así como se ve, es lo mínimo necesario que vas a necesitar para que la instancia de Rstudio iniciada como lab227 en docker pueda funcionar. De hecho, tal vez esto sea lo más simple y lo que deberías probar primero.

Correct answer by Patricio Moracho on August 27, 2021

Los archivos son de propietario root y grupo root, ¿tu programa también se ejecuta como root? Yo me decanto mas por comprobar los permisos de acceso.

También puedes ejecutar docker inspect <volume_name> para ver si el volumen es RW o RO y esta montado correctamente.

Answered by Carlos on August 27, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP