tag run library hub example dockers container docker

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.

  1. Instale el servidor ssh para su contenedor y permita el acceso a la raíz.
  2. Ejecute su contenedor de docker con -p localport: 22
  3. 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