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

asc*_*bol 46 docker

现在我找到了一种方法将主机文件公开给容器(-v选项),我想做一些相反的事情:

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

sshfs可能可以完成这项工作,但由于正在运行的容器已经是某种主机目录,我想知道是否有便携式(在aufs,btrfs和设备映射器之间)这样做?

zhi*_*ang 25

最好的方法是:

  $ docker cp CONTAINER:FILEPATH LOCALFILEPATH
  $ vi LOCALFILEPATH
  $ docker cp LOCALFILEPATH CONTAINER:FILEPATH
Run Code Online (Sandbox Code Playgroud)

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

使用$ docker运行的限制:它将创建一个新容器.

  • 这只是复制这些文件 - 然后将它们复制回来 (7认同)

Adr*_*uat 24

虽然有可能,而其他答案解释如何,但如果可以的话,应该避免在Union File System中编辑文件.

您对卷的定义并不完全正确 - 它更多的是绕过Union文件系统而不是在主机上公开文件.例如,如果我这样做:

$ docker run --name="test" -v /volume-test debian echo "test"
Run Code Online (Sandbox Code Playgroud)

/volume-test容器内的目录不是Union File System的一部分,而是存在于主机的某个位置.我没有指定主机上的位置,因为我可能不在乎 - 我没有暴露主机文件,只是创建一个可在容器和主机之间共享的目录.您可以通过以下方式找到主机的确切位置:

$ docker inspect -f "{{.Volumes}}" test
map[/volume_test:/var/lib/docker/vfs/dir/b7fff1922e25f0df949e650dfa885dbc304d9d213f703250cf5857446d104895]
Run Code Online (Sandbox Code Playgroud)

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

  • @ s.matthew.english没有MacOS容器这样的东西.在MacOS上,Docker在内部运行一个xhyve Linux VM来托管Docker容器.卷路径仅存在于此VM中(几乎对您隐藏). (2认同)

Mik*_*ikl 6

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

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

我们可以手动完成所有这些步骤,但我编写了简单的 bash 脚本,只需一次调用即可轻松完成此操作。

/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;
Run Code Online (Sandbox Code Playgroud)

使用示例:

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

该脚本非常简单,但对我来说效果很好。

任何建议表示赞赏。