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:
,或者您可以使用concept。您可以考虑这个“强”文件系统支持的数据库<强>存储在主机上(仅数据容器),容器允许使用“代码>-v.< /P>-v/hostdir/user uploads:/srv/myapp/user uploads
”。
- 您是正确的:对于生产部署-您可以使用源代码(
)构建映像,您可以为每个版本构建映像。应该不需要在生产中编辑源代码git clone
- 对于开发环境-您应该在不使用源代码的情况下构建映像,或者在使用相同映像进行部署/开发时,您可以使用卷来隐藏源代码目录。然后git在本地克隆源代码,并使用volume
与容器共享源代码。最好是以只读方式共享源代码(-v/hostdir/project/src:/srv/project
,最后),任何临时或中间文件都应存储在容器中的其他位置。在服务启动之前,我已经在容器启动时执行了设置脚本(数据迁移、重建一些索引/缓存数据文件等)。因此,每当我觉得需要刷新:ro
,我就杀死dev容器并再次运行它。或者,我不停止旧容器-我只是运行另一个re init
/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