如何在开发中编辑Docker容器中的代码?

我的所有网站的代码都放在我的容器中的/srv下。

我的Dockerfile使用git下载代码,并使其成为图像的一部分,以便于部署到生产环境。

但是,如何编辑开发中的代码呢? 我认为使用卷是解决scheme,例如: -v /docker/mycontainer/srv:/srv 。 但它会覆盖容器中的目录。 如果这是我第一次运行它,它会清空它,因为主机中没有任何东西。 所以无论我在Dockerfile中做了什么都会丢失。

/srv/myapp里面还有目录和文件,我想在不同版本的应用程序之间共享,例如: /srv/myapp/user-uploads 。 这是专业网站开发中的常见做法 。

那么我能做些什么来做所有这些事情呢?

  • 编辑/ srv开发中的代码
  • 共享/ srv / myapp /用户上传跨不同版本
  • 让Dockerfile下载代码。 在Docker之外做“git clone”或者“git pull”会击败Docker的目的。 除此之外,还有一些我无法在主机上运行的东西,比如数据库迁移或其他特定于应用程序的脚本。

有没有办法做一个反向卷装? 我的意思是让容器覆盖主机,而不是相反。

我想在运行容器的守护进程之前,可以将/ srv拷贝到/srv.deployment-copy。 然后,当我运行守护进程时,检查/srv.deployment-copy是否存在,并将所有内容都复制回/ srv。 这样我可以使用/ srv作为卷,并且仍然能够使用Dockerfile将代码部署到它。 我已经使用所有docker命令的别名,所以自动化这不会是一个问题。 你怎么看?

还有另一种方法可以从另一个容器启动容器:

看看https://docs.docker.com/userguide/dockervolumes/
创build和装载数据卷容器

如果您想要在容器之间共享某些持久性数据,或者想要使用非持久性容器,则最好创build一个名为“数据容量容器”,然后从中装入数据。

让我们创build一个新的具有共享卷的命名容器。

 $ sudo docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres 

然后可以使用–volumes-from标志将/ dbdata卷挂载到另一个容器中。

 $ sudo docker run -d --volumes-from dbdata --name db1 training/postgres 

另一个:

 $ sudo docker run -d --volumes-from dbdata --name db2 training/postgres 

我们可以用卷执行的另一个有用的function是用于备份,恢复或迁移。 我们通过使用–volumes-from标志来创build一个装载该卷的新容器,如下所示:

 $ sudo docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata 

=============

我认为你不应该使用你的主机目录到一个容器。 但是你可以使用它的所有权力。 您可以使用其他容器使用完善的编辑器和工具编辑卷中的文件。 而容器这个你的应用程序将是干净的,没有开销。

结构是:
– )应用程序数据的容器
docker run -d -v /data --name data
– )应用程序二进制文件的容器
docker run -d --volumes-from data --name app1
– 编辑器和公用事业发展的容器
docker run -d --volumes-from data --name editor

我发现在开发中编辑代码的最佳方式是照常安装(包括克隆应用程序的存储库),但是将容器中的所有代码移动到/srv/myapp.deploy.dev 。 然后用/srv/myapprw卷和一个init.d脚本启动该容器,清理该卷并像下面这样拷贝新的内容:

 rm -r /srv/myapp/* rm -r /srv/myapp/.[!.]* cp -r /srv/myapp.deploy.dev/. /srv/myapp rm -r /srv/myapp.deploy.dev 

注意:您不能使用-v 容器目录装载到主机目录。

我不认为你需要mangle / srv和/srv.deployment-copy。 如果你

我觉得:

  • 您应该将卷用于持久性/共享数据: -v /hostdir/user-uploads:/srv/myapp/user-uploads ,或者您可以使用数据卷容器概念。 您可以将其视为一个存储在主机(仅数据容器) 的文件系统支持的数据库 ,并允许容器使用-v

  • 您是正确的:对于生产部署 – 您可以使用源代码( git clone )构build映像,为每个版本创build一个映像。 生产中不需要编辑源代码。

  • 对于开发环境 – 您应该在没有源代码的情况下构build映像,或者在使用相同的映像进行部署/开发的情况下,可以使用卷影射源代码目录。 然后在本地克隆源代码,并使用volume -v /hostdir/project/src:/srv/project来与容器共享源代码。 最好你应该共享源代码只读( :ro ),任何临时或中间文件应该存储在容器中的其他地方。 在服务启动之前,我已经设置了在容器启动时执行的脚本(数据迁移,重build一些索引/caching数据文件等)。 所以每当我觉得我需要新的re-init ,我只是杀了开发容器,并再次运行。 或者,我不停止旧的容器 – 我只是运行另一个。

我find了一个很好的方法,只使用git:

 CONTAINER=my_container SYNC_REPO=/tmp/my.git CODE=/var/www #create bare repo in container docker exec $CONTAINER git init --bare $SYNC_REPO #add executable syncing hook that checks out into code dir in container printf "#!/bin/sh\nGIT_WORK_TREE=$CODE git checkout -f\n" | \ docker exec -i $CONTAINER bash -c "tee $SYNC_REPO/hooks/post-receive;chmod +x \$_" #use git-remote-helper to use docker exec instead of ssh for git git remote add docker "ext::docker exec -i $CONTAINER sh -c %S% $SYNC_REPO" #push updated local code into docker git push docker master 

假设你有一个代码的本地git。 Git需要安装在容器中。 另外,你可能可以使用docker run和一个共享卷的数据容器与安装的git。

假设git不是容器的入口点,如果git安装在你的docker容器中,你可以ssh进入容器并运行git clone / git pull 。 由于卷与主机共享的方式,从容器到文件的更改也会发送给主机(实际上它们是相同的文件)。

这里有一些解释如何快速ssh进入一个容器。