如何从主机编辑Docker容器文件?

现在,我find了一种方法来公开主机文件的容器(-v选项)我想做一个相反的:

如何使用主机编辑器从正在运行的容器中编辑文件?

sshfs可能可以完成这项工作,但是由于正在运行的容器已经是某种主机目录了,我想知道是否有可移植的(在aufs,btrfs和device mapper之间)的方式来做到这一点?

虽然有可能,而另一个答案解释如何,如果可以的话,你应该避免在联合文件系统中编辑文件。

你对卷的定义并不完全正确 – 这更多的是绕过联盟文件系统而不是在主机上公开文件。 例如,如果我这样做:

$ docker run --name="test" -v /volume-test debian echo "test" 

容器中的目录/volume-test不是联盟文件系统的一部分,而是存在于主机的某处。 我没有指定主机上的位置,因为我可能不在乎 – 我不公开主机文件,只是创build一个可以在容器和主机之间共享的目录。 您可以通过以下方式find主机上的具体位置:

 $ docker inspect -f "{{.Volumes}}" test map[/volume_test:/var/lib/docker/vfs/dir/b7fff1922e25f0df949e650dfa885dbc304d9d213f703250cf5857446d104895] 

如果你真的需要快速编辑一个文件来testing一些东西,可以使用docker exec在容器中获得一个shell并直接编辑,或者使用docker cp将文件复制出来,在主机上编辑并且复制回去。

最好的方法是:

  $ docker cp CONTAINER:FILEPATH LOCALFILEPATH $ vi LOCALFILEPATH $ docker cp LOCALFILEPATH CONTAINER:FILEPATH 

$ docker exec的限制:它只能附加到正在运行的容器。

$ docker run的限制:它将创build一个新的容器。

我从我的IDE使用sftp插件。

  1. 为您的容器安装ssh服务器并允许root用户访问。
  2. 用-p localport:22运行你的docker容器
  3. 从你的IDE安装一个sftp插件

使用sublime sftp插件的示例: https : //www.youtube.com/watch?v=HMfjt_YMru0

这是我使用的脚本:

 #!/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" 

和当我修复它的要点,但忘记更新这个答案: https : //gist.github.com/dmohs/b50ea4302b62ebfc4f308a20d3de4213

我们可以使用另一种方式编辑工作容器中的文件(如果容器被停用,这将不起作用)。

逻辑是:
– )将文件从容器复制到主机
– )使用主机编辑器编辑主机上的文件
– )将文件复制回容器

我们可以做所有这些步骤manualy,但我已经写了简单的bash脚本,使这一个简单的通话。

/斌/ 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; 

用法示例:

dmcedit CONTAINERNAME / path / to / file / in / container

脚本非常简单,但对我来说工作正常。

任何build议表示赞赏。

 docker run -it -name YOUR_NAME IMAGE_ID /bin/bash $>vi path_to_file 

以下为我工作

docker run -it IMAGE_NAME /bin/bash

例如。 我的图像被称为ipython /笔记本

docker run -it ipython/notebook /bin/bash