远程`docker-compose build`:解决方法慢速连接

时间:2016-09-23 15:11:13

标签: docker deployment docker-compose automated-deploy

我使用docker-compose部署到远程主机。这就是我的配置:

# stacks/web.yml
version: '2'

services:
  postgres:
    image: postgres:9.6
    restart: always
    volumes:
      - db:/var/lib/postgresql/data

  redis:
    image: redis:3.2.3
    restart: always

  web_server:
    depends_on: [postgres]
    build: ../sources/myapp
    links: [postgres]
    restart: always
    volumes:
      - nginx_socks:/tmp/socks
      - static_assets:/source/public

  sidekiq:
    depends_on: [postgres, redis]
    build: ../sources/myapp
    links: [postgres, redis]
    restart: always
    volumes:
      - static_assets:/source/public

  nginx:
    depends_on: [web_server]
    build: ../sources/nginx
    ports:
      - "80:80"
    volumes:
      - nginx_socks:/tmp/socks
      - static_assets:/public
    restart: always

volumes:
  db:
  nginx_socks:
  static_assets:

# stacks/web.production.yml
version: '2'

services:
  web_server:
    command: bundle exec puma -e production -b unix:///tmp/socks/puma.production.sock
    env_file: ../env/production.env

  sidekiq:
    command: bundle exec sidekiq -e production -c 2 -q default -q carrierwave
    env_file: ../env/production.env

  nginx:
    build:
      args:
        ENV_NAME: production
        DOMAIN: production.yavende.com

我部署使用:

eval $(docker-machine env myapp-production)`
docker-compose -f stacks/web.yml -f stacks/web.production.yml -p myapp_production build -no-deps web_server sidekiq
docker-compose -f stacks/web.yml -f stacks/web.production.yml -p myapp_production up -d

虽然这在本地完美运行,但我过去使用这种方法成功完成了部署,现在它在构建" web_server"服务,最后显示一些超时错误,就像我在this issue中描述的那样。

我认为问题源于我的缓慢连接(阿根廷 - >美国的DigitalOcean服务器)和我尝试构建图像并推送它们而不是使用集线器托管图像。

我已经能够通过将我的撰写配置克隆到服务器并直接在那里运行docker-compose来进行部署。

问题是:是否有更好的方法来自动化此过程?使用docker-compose动态构建图像是一种很好的做法吗?

我一直在考虑自动化将源代码克隆到服务器和docker-compose内容的过程,但可能有更好的工具来解决这个问题。

1 个答案:

答案 0 :(得分:0)

我是远程构建图像。这意味着推动通过网络构建图像所需的整个源。对于一些从阿根廷发送到美国某些虚拟服务器的数据超过400MB的图像,事实证明速度非常慢。

解决方案是彻底改变我的堆栈的方法:

  • 我没有使用Dockerfile ARG动态构建图像,而是修改了我的源应用程序和它的docker镜像,以便在运行时通过环境变量接受选项。
  • 使用DockerHub自动构建,与GitHub集成。

这意味着我只推动改变 - 不是整个源 - 通过git。然后DockerHub构建图像。

然后我docker-compose pulldocker-compose up -d我的网站。

免费替代品正在运行您自己托管的docker注册表和/或可能是GitLab,因为它最近发布了它自己的docker镜像注册表:https://about.gitlab.com/2016/05/23/gitlab-container-registry/