run - docker tag example
¿Cómo editar los archivos del contenedor Docker del host? (7)
Ahora que encontré una forma de exponer los archivos host al contenedor (opción -v) me gustaría hacer todo lo contrario:
¿Cómo puedo editar archivos desde un contenedor en ejecución con un editor de host?
sshfs probablemente podría hacer el trabajo, pero dado que un contenedor en ejecución ya es una especie de directorio de host, me pregunto si existe una forma portátil de hacerlo (entre aufs, btrfs y el mapeador de dispositivos).
Aquí está el script que uso:
#!/bin/bash
IFS=$''/n/t''
set -euox pipefail
CNAME="$1"
FILE_PATH="$2"
TMPFILE="$(mktemp)"
docker exec "$CNAME" cat "$FILE_PATH" > "$TMPFILE"
$EDITOR "$TMPFILE"
cat "$TMPFILE" | docker exec -i "$CNAME" sh -c ''cat > ''"$FILE_PATH"
rm "$TMPFILE"
y la esencia para cuando lo solucione, pero olvide actualizar esta respuesta: https://gist.github.com/dmohs/b50ea4302b62ebfc4f308a20d3de4213
La mejor manera es:
$ docker cp CONTAINER:FILEPATH LOCALFILEPATH
$ vi LOCALFILEPATH
$ docker cp LOCALFILEPATH CONTAINER:FILEPATH
Limitaciones con $ docker exec: solo se puede conectar a un contenedor en ejecución.
Limitaciones con $ docker run: creará un nuevo contenedor.
Lo siguiente funcionó para mí
docker run -it IMAGE_NAME /bin/bash
p.ej. mi imagen se llama ipython / notebook
docker run -it ipython/notebook /bin/bash
Podemos utilizar otra forma de editar archivos dentro de contenedores en funcionamiento (esto no funcionará si el contenedor se detiene).
La lógica es para:
-) copiar archivo de contenedor a host
-) editar archivo en el host utilizando su editor de host
-) copiar el archivo de vuelta al contenedor
Podemos hacer todos estos pasos de manera manual, pero he escrito un script simple de bash para que esto sea fácil con una sola llamada.
/ bin / dmcedit:
#!/bin/sh
set -e
CONTAINER=$1
FILEPATH=$2
BASE=$(basename $FILEPATH)
DIR=$(dirname $FILEPATH)
TMPDIR=/tmp/m_docker_$(date +%s)/
mkdir $TMPDIR
cd $TMPDIR
docker cp $CONTAINER:$FILEPATH ./$DIR
mcedit ./$FILEPATH
docker cp ./$FILEPATH $CONTAINER:$FILEPATH
rm -rf $TMPDIR
echo ''END''
exit 1;
Ejemplo de uso:
dmcedit CONTAINERNAME / ruta / a / archivo / en / contenedor
El script es muy fácil, pero funciona bien para mí.
Cualquier sugerencia es apreciada
Si bien es posible, y las otras respuestas explican cómo, debe evitar editar archivos en el Sistema de archivos de la Unión si puede.
Su definición de volúmenes no es del todo correcta; se trata más de pasar por alto el Sistema de archivos de la Unión que exponer los archivos en el host. Por ejemplo, si lo hago:
$ docker run --name="test" -v /volume-test debian echo "test"
El directorio /volume-test
dentro del contenedor no formará parte del Sistema de archivos de la Unión y, en su lugar, existirá en algún lugar del host. No he especificado dónde en el host, ya que no me importa, no estoy exponiendo archivos de host, simplemente creando un directorio que se puede compartir entre los contenedores y el host. Puede averiguar exactamente dónde está en el host con:
$ docker inspect -f "{{.Volumes}}" test
map[/volume_test:/var/lib/docker/vfs/dir/b7fff1922e25f0df949e650dfa885dbc304d9d213f703250cf5857446d104895]
Si realmente necesita hacer una edición rápida de un archivo para probar algo, use docker exec
para obtener un shell en el contenedor y edítelo directamente, o use docker cp
para copiar el archivo, edite en el host y vuelva a copiar .
Uso el plugin sftp de mi IDE.
- Instale el servidor ssh para su contenedor y permita el acceso a la raíz.
- Ejecute su contenedor de docker con -p localport: 22
- Instale desde su IDE un plugin sftp
Ejemplo de uso del complemento sublime de sftp: https://www.youtube.com/watch?v=HMfjt_YMru0
docker run -it -name YOUR_NAME IMAGE_ID /bin/bash
$>vi path_to_file