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

Deployment 如何在开发中编辑Docker容器中的代码?,deployment,web-deployment,docker,Deployment,Web Deployment,Docker,我的容器中有/srv下的所有网站代码 我的Dockerfile使用git下载代码,并使其成为映像的一部分,以便于部署到生产环境中 但是,如何在开发中编辑代码呢?我认为使用卷是解决方案,例如:-v/docker/mycontainer/srv:/srv。但它会覆盖容器中的目录。如果是我第一次运行它,它会清空它,因为主机中没有任何内容。所以无论我在Dockerfile做了什么都会丢失 /srv/myapp中还有一些目录和文件,我希望在我的应用程序的不同版本中共享这些目录和文件,例如:/srv/mya

我的容器中有
/srv
下的所有网站代码

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

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

/srv/myapp
中还有一些目录和文件,我希望在我的应用程序的不同版本中共享这些目录和文件,例如:
/srv/myapp/user uploads
。这是一个专业的网页开发

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

  • 在开发中编辑/srv中的代码
  • 跨不同版本共享/srv/myapp/用户上传
  • 让Dockerfile下载代码。在我看来,在Docker之外进行“git克隆”或“git拉”将违背Docker的目的。此外,还有一些东西我不能在主机上运行,比如数据库迁移或其他特定于应用程序的脚本
有没有办法进行反向卷装载?我的意思是让容器覆盖主机,而不是相反


我认为一个解决方案可能是在运行容器的守护进程之前将/srv复制到/srv.deployment-copy。然后,当我运行守护进程时,检查/srv.deployment-copy是否存在,并将所有内容复制回/srv。通过这种方式,我可以将/srv用作卷,并且仍然能够使用Dockerfile将代码部署到其中。我已经在为所有docker命令使用别名,所以自动化这不会是一个问题。你认为呢?

假设git不是容器的入口点,如果git安装在docker容器中,你可以通过ssh连接到容器中并运行git克隆/
git pull
。由于卷与主机共享的方式,从容器对文件所做的更改也将对主机进行更改(实际上是相同的文件)

这是一些关于如何快速ssh到容器中的说明。

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

$ sudo docker run -d --volumes-from dbdata --name db1 training/postgres
我认为您不需要损坏/srv和/srv.deployment-copy。如果你

我认为:

  • 对于持久/共享数据,您应该使用volume:
    -v/hostdir/user uploads:/srv/myapp/user uploads
    ,或者您可以使用concept。您可以考虑这个“强”文件系统支持的数据库<强>存储在主机上(仅数据容器),容器允许使用“代码>-v.< /P>
  • ”。
  • 您是正确的:对于生产部署-您可以使用源代码(
    git clone
    )构建映像,您可以为每个版本构建映像。应该不需要在生产中编辑源代码

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


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

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

使用另一个容器中的卷启动容器还有另一种方法:


创建和装载数据卷容器

如果要在容器之间共享某些持久性数据,或者要从非持久性容器中使用这些数据,最好创建一个命名的数据卷容器,然后从中装载数据

让我们创建一个新的命名容器,其中包含一个要共享的卷

$ 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
我们可以对卷执行的另一个有用功能是将它们用于备份、恢复或迁移。为此,我们使用--volumes from标志创建一个新容器来装载该卷,如下所示:

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

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

结构为:
-)应用程序数据容器
docker run-d-v/data--name数据

-)应用程序二进制文件的容器
docker run-d--来自数据的卷--名称app1

-)用于开发的编辑器和实用程序的容器

docker run-d--数据卷--名称编辑器

我发现了一种使用git的好方法:

CONTAINER=my\u CONTAINER
SYNC_REPO=/tmp/my.git
代码=/var/www
#在容器中创建裸回购
docker exec$CONTAINER git init--bare$SYNC\u REPO
#添加签出到容器中的代码目录的可执行同步挂钩
printf“#!/bin/sh\nGIT#u WORK_TREE=$CODE git checkout-f\n”|\
docker exec-i$容器bash-c“T