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?
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
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
Depende de lo que el sistema te permita hacer, acá van una serie de opciones:
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
.
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
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
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP