我是Docker的新手, 在docker-compose.yml v.3.7中,我有一个共享卷(称为:apdata),由应用程序和Web服务使用,如下所示:
version: "3.7"
services:
app:
container_name: application
build:
context: ./
dockerfile: app.dockerfile
working_dir: /var/log
volumes:
- apdata:/var/log
# - type: volume
# source: apdata
# target: /var/log
# volume:
# nocopy: true
environment:
- "DB_PORT=3306"
- "DB_HOST=database"
web:
container_name: website
build:
context: ./
dockerfile: web.dockerfile
working_dir: /var/www
volumes:
- apdata:/var/www
# - type: volume
# source: apdata
# target: /var/www
# volume:
# nocopy: true
# - type: bind
# source: ../www/
# target: /var/www
ports:
- 8888:80
depends_on:
- app
volumes:
apdata:
driver: local
dbdata:
上面的配置看起来正常(没有错误),但是如何与本地计算机/主机同步数据?
问题:是否有办法,或者如何将卷数据映射/绑定到主机或本地驱动器?例如:
在apdata中:Web服务:/var/www
映射到本地文件:c:\test
在apdata中:应用程序服务:/var/log
映射到本地文件:..\log
因此我可以读取主机(本地计算机)中的日志-Windows 然后我可以在本地计算机上部署或编辑代码,并将其同步到容器
这可能吗?
修改
它不是重复的,让我尝试解释更多:我有1个卷apdata,该卷由2个服务(应用程序和网站)共享。并映射如下:application service --> /var/log
和website service --> /var/www
然后使用apdata,我想将其映射/同步到本地计算机,这样我就可以轻松进行开发,并且可以直接从本地计算机上查看日志,如下所示:apdata: /var/log
同步到{{1 }}和../log
同步到apdata: /var/www
答案 0 :(得分:0)
实际上,完全有可能通过利用volume configuration in docker-compose 3.2+的driver
和driver_opts
设置
根据您的示例,在Linux文件系统中,可能类似于:
volumes:
apdata:
driver: local
driver_opts:
type: none
device: /home/$USER/data/app
o: bind
dbdata:
driver: local
driver_opts:
type: none
device: /home/$USER/data/web
o: bind
当然,您必须确保目标文件已经存在
mkdir /home/$USER/data/{app,web}
作为此解决方案的一个不错的副作用,您仍然可以使用以下方式以常规方式列出您的卷:
docker volume ls
同时,您将能够通过这种方式绑定到此类卷的文件夹中的容器中直接访问所有共享内容。
更新
一种更简单的方法(例如,如果您只是想将其用于测试目的)是简单地摆脱“卷”部分(位于docker-compose文件的底部),而是直接将卷绑定到卷中每个服务定义的部分:
version: "3.7"
services:
app:
container_name: application
build:
context: ./
dockerfile: app.dockerfile
working_dir: /var/www
volumes:
- /home/$USER/mysite/logs:/var/log
web:
container_name: website
build:
context: ./
dockerfile: web.dockerfile
working_dir: /var/www
volumes:
- /home/$USER/mysite/test:/var/www
ports:
- 8888:80
depends_on:
- app
对于Windows系统,只需替换主机目录的完整路径以匹配您的实际文件夹结构即可,例如:
...
volumes:
- C:\mysite\logs:/var/log
btw:您不再需要在docker-compose中链接容器,因为现在它们已由docker自动链接,因此在您的web
容器/服务中运行的任何内容都将始终能够找到您的{{ 1}}按名称提供服务(就像它们实际上是链接一样)
所以..您可以删除此部分:
app
在此处添加一个额外的示例(以匹配您最近的问题更新):
...
links:
- app
以这种方式运行它时,您将能够在主机中导航至以下路径:version: "3.7"
services:
app:
container_name: application
build:
context: ./
dockerfile: app.dockerfile
working_dir: /var/www
volumes:
- C:\log:/var/log
web:
container_name: website
build:
context: ./
dockerfile: web.dockerfile
working_dir: /var/www
volumes:
- C:\test:/var/www
ports:
- 8888:80
depends_on:
- app
#-- end of file
和C:\log
,并在其中复制任何内容,您的容器都将能够自动访问它(但在它们各自的映射路径上)。
例如,如果您复制网站的更新版本(或即使直接在该C:\temp
文件夹中进行编辑),则容器将自动具有相同的更新内容。
每当您的应用生成新的日志条目(或文件)时,您都可以直接在该C:\test
文件夹中访问它,实际上,该文件夹中的C:\log
文件夹应用程序的范围(在其自己的容器内)
现在,如果您希望两个内容(应用程序的/var/log
和网络的/var/log
)共享完全相同的目录(并因此在此类路径中共享相同的文件和文件夹),则只需使用卷绑定左侧的相同目录