【问题标题】:Remote `docker-compose build`: workaround slow connections远程`docker-compose build`:解决慢速连接
【发布时间】:2016-09-23 15:11:12
【问题描述】:

我正在使用 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 服务器)和我尝试构建图像并推送它们而不是使用集线器托管的图像。

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

问题是:有没有更好的方法来自动化这个过程?使用 docker-compose 动态构建图像是一种好习惯吗?

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

【问题讨论】:

  • 使用 docker-hub -- 每次需要时都构建所需的映像是不好的做法,而且实际上无法测试。创建一个工件并在环境之间推广它,从 CI、测试到产品。
  • 参数化呢?我不认为我想构建和推送多个图像,比如 nginx,每个环境一个。
  • 接受来自环境变量的参数
  • 正如@dnephin 所说,参数应该由容器在运行时使用,而不是在构建时使用。您可以安排一些事情,以便有一个引导脚本来为特定环境配置容器并将配置文件存储在主机或数据卷中,如果您不想每次启动新容器时都这样做。

标签: docker deployment docker-compose automated-deploy


【解决方案1】:

我正在远程构建图像。这意味着将构建图像所需的整个源推送到网络上。对于一些从阿根廷发送到美国的一些虚拟服务器的数据超过 400MB 的图像,被证明非常慢。

解决方案是彻底改变对我的堆栈进行 docker 化的方法:

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

这意味着我只通过 git 推送更改——而不是整个源代码。然后 DockerHub 构建镜像。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多