如何配置Docker日志记录以有条件地发送到CloudWatch?

5

我在docker-compose.yml文件中有以下内容:

  web:
    image: my_web
    build:
      context: ./
      dockerfile: web.docker
    container_name: my_web
    networks:
      - front
    ports:
      - "80:8080"
    volumes:
      - wwwlogs:/var/logs/www
    env_file:
      - ${SERVICE_ENVIRONMENT}.env
    links:
      - revproxy
    logging:
      driver: awslogs
      options:
        awslogs-group: my-web-group
        awslogs-region: us-east-1
        awslogs-stream-prefix: my-web

这在生产环境中很好用,可以按预期将所有内容发送到CloudWatch。然而,我不清楚当我想要在本地使用相同的docker文件(不发送到AWS,只记录到STDOUT/STDERR),以及在staging环境中(我想将其发送到不同的awslogs组/-prefix)时,它应该如何工作。
有什么想法吗?总的来说,我不喜欢为每个环境单独创建docker文件-重复的代码条目会增加某些东西被遗漏或无法正确维护的可能性。但是Docker似乎有限的能力来有条件地提供东西。

有没有考虑创建一个 shell 脚本,基于模板和一些环境条件来创建 docker-compose.yml 文件,然后运行 docker-compose up。通常对于这种情况,我们使用配置工具如 Ansible 和 Chef 来根据不同环境值,从模板创建文件。 - Mahattam
1个回答

1
这更多是Docker的限制,无法指定多个日志驱动程序。使用单个docker-compose文件发送到多个目标将更加复杂,因为Docker不支持,但是可以实现。
例如,您可以使用 Fluentd日志驱动程序,并且必须启动一个单独的sidecar容器 Fluentd。然后在配置中,您可以基于环境创建路由规则。您可以说dev路由到“stdout”,prod路由到“awslogs”,使用类似 fluentd CloudWatch日志插件的东西。 这是另一个关于如何使用docker-compose配置Fluentd的示例。

1
我会接受这个答案,因为我认为它是正确的,但我真的对Docker感到失望。我想要黄金配置文件,在部署到不同环境之前不被脚本修改,而且我觉得为我认为是相当标准的用例包含一个sidecar是错误的。也许这真的是对awslogs驱动程序的批评 - 它应该有一个选项在非连接环境下运行并转储到文件/标准输出。无论如何,“您无法指定多个日志记录驱动程序”我认为是正确的答案。 - DrTeeth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接