运维 使用 docker-sync 让 mac 和 docker 之间的文件同步变快

heroyct · 2018年08月06日 · 最后由 zhaojc 回复于 2019年06月24日 · 16070 次阅读

最近,在 mac 上面安装了 docker,然后让开发环境运行在 docker 上面

总的来说感觉不错
但是同一个页面,在 linux 上面的时候需要 4 秒,在 mac for docker 上面需要 25 秒

调查了一下原因

osxfs 的介绍,有兴趣的可以研究下
https://docs.docker.com/docker-for-mac/osxfs/#performance-issues-solutions-and-roadmap

搜索了一下解决办法

1. vagrant -> virtualbox -> linux -> docker

试了下用 vagrant 安装 linux,然后 docker 跑在 linux 上面,用 nfs 来同步
速度确实变快了,但是多安装了一层总感觉有点麻烦
所以调查了一下其他的解决办法

2. docker-sync

在 docker-for-mac 的网站和 github 的 issue 里面有介绍

试了下感觉不错,总结下如何使用的

1. 在 mac 上面安装 docker-sync

$ gem install docker-sync
$ brew install fswatch
$ brew install unison
$ brew install eugenmayer/dockersync/unox
$ docker-sync start

2. 添加 docker-sync.yml 文件

version: '2'

syncs:
  sync-folder:
    src: '.'
    sync_strategy: 'unison'
    # 同步时的用户ID,不指定的话为root
    sync_userid: '1000'
    sync_excludes: ['vendor/bundle/', 'node_modules', 'tmp']

具体设置可以看这里

3. 添加 docker-compose-dev.yml 文件

version: '3'

volumes:
  sync-folder:
    external: true

services:
  app:
    volumes:
      - sync-folder:/www/sample_project

把 mac 的当前文件夹和 docker 服务器里面的/www/sample_project 进行同步

4. docker-compose up

$ docker-compose -f docker-compose.yml -f docker-compose-dev.yml up -d

然后无论在 mac 还是在 docker 里面进行文件修改,都会自动进行同步
有时候不知道什么原因无法同步的时候可以重启 docker-sync

$ docker-sync clean
$ docker-sync start

总结

mac for docker 的文件同步很慢,目前发现两种解决方法

  1. vagrant -> virtualbox -> linux -> docker
  2. docker-sync

个人比较喜欢第二种,有更好的解决办法请回复我

我用 docker-sync 时,同步会有延迟,改代码之后要把页面刷两三遍,才有反应,而且 container 里 rails g 出来的东西,不会在 local 出现,需要重启 docker 才行,推荐用官方的 cached
https://docs.docker.com/docker-for-mac/osxfs-caching/

services:
  app:
    volumes:
      - .:/www/sample_project:cached

最标准的解决方案应该是在 Linux 系统上使用 docker。😂 😅
买台电脑装 linux 系统做开发

@ fan124

我用 docker-sync 时,同步会有延迟

目前还没发现延迟,我在 mac 改完保存以后刷新页面就更新了,IDE 的话可能是还未自动保存

用 watch 命令来观察延迟,基本未发现延迟

watch -n 1 cat test.rb

container 里 rails g 出来的东西,不会在 local 出现

还没试过,等会试下,重启 docker 是一种方法 也可以试试这个

$ docker-sync clean
$ docker-sync start

推荐用官方的 cached

services:
  app:
    volumes:
      - .:/www/sample_project:cached

这个在 mac for docker 下太慢,没具体测试,感觉慢了十倍,基本没法用,所以才有这篇文章
很多在 mac 下用 docker,不想再搞个虚拟机的可以参考下

速度慢是因为 Asset Pipeline 编译时会在 tmp 下产生很多临时文件,而 mac 和 container 的文件系统不一样,同步时需要做大量的格式转换。 (docker 好像没有配置可以让部分文件或文件夹不做同步)

我这里用的 UI 是在网上购买的,所以带了很多 js 和 css 文件,8000 多个吧(docker-compose up 之后第一次载入需要 2 分钟),我把大部分暂时没有用到的 assets 删除之后就变快了(第一次载入不到 20 秒)。

@fan124 如果使用自带的已经可以满足你现在的项目的话,没必要在使用其它的

我使用 docker 自带的看一个页面大概需要 25 秒,实在太慢

慢的原因帖子里面已经介绍 (osxfs 的原因)

以前用 vagrant 大概是 4 秒,现在用 docker-sync 大概也是 4 秒

heroyct 用现代 Rails 逃离单页面应用 “兔子洞” 提及了此话题。 10月01日 18:26

Service app has neither an image nor a build context specified. At least one must be provided. 处处是坑呀这是怎么回事呀我是 mac docker Server Version: 18.09.2

SpiderEvgn [该话题已被删除] 提及了此话题。 08月04日 14:38
需要 登录 后方可回复, 如果你还没有账号请 注册新账号