4

我在 Google 的 Container-Optimized OS (COS) 上有一个运行时间很长(而且很冗长)的容器作业,最终生成了足够的日志来填满磁盘。

据我所知,在使用 COS 时没有办法轮换/限制日志文件的大小。

检查正在运行的容器,它似乎将一个不断增长的文件写入/var/lib/docker/containers/(安装在有状态分区上)并且HostConfig.LogConfig.Config是空的。

我最终不得不通过 SSH 登录并手动删除数 GB 的日志文件,以使 VM 再次运行。

我通读了https://cloud.google.com/compute/docs/containers/configuring-options-to-run-containers并且据我所知,没有办法(比如说)--log-opt max-size=XX按照 Docker文档: https ://docs.docker.com/config/containers/logging/json-file/

有什么办法可以通过那个标志吗?如果做不到这一点,是否有关于如何轮换日志/限制日志大小/避免遇到此问题的建议?

4

3 回答 3

9

目前没有任何方法可以将该标志直接传递给您的容器。话虽如此,有一种解决方法可能对您有用。

它要求您在 /etc/docker/daemon.json 中全局设置标志,然后它将应用于该 VM 上启动的所有容器。您可以使用以下片段通过启动脚本执行此操作:

cat <<EOF > /etc/docker/daemon.json
{
  "live-restore": true,
  "storage-driver": "overlay2",
  "log-opts": {
    "max-size": "10m"
  }
}
EOF
systemctl restart docker

有关启动脚本的说明,请参阅https://cloud.google.com/compute/docs/startupscript#providing_startup_script_contents_directly。请参阅 docker 关于“log-opts”标志的文档:https ://docs.docker.com/config/containers/logging/json-file/#usage

于 2019-08-29T07:23:26.643 回答
5

您可以限制docker-compose.yml.

只需要添加这些行:

services:
  app:
    container_name: app
    image: node
    restart: always
    volumes:
      - ./app:/home/node/app
    working_dir: /home/node/app
    ports:
      - 3000:3000
    networks:
      - main
    command: "npm start" 
    logging:
      driver: "json-file"
      options:
        max-file: "5"   # number of files or file count
        max-size: "10m" # file size

  db:
    ...
    logging:
      driver: "json-file"
      options:
        max-file: "3"   # number of files or file count
        max-size: "10m" # file size
于 2019-10-26T14:59:07.330 回答
2

默认情况下,容器日志未配置为轮换或由 docker 限制为最大大小。如果容器运行足够长的时间并生成足够多的日志,日志文件可能会变得如此之大,以至于填满磁盘空间。

有关可以设置的内容的更多信息,请参阅Docker 日志记录文档。

为主机上的容器设置日志限制 --log-opt 可以配置 max-size 和 max-file 以便容器日志在达到最大限制时滚动,并且在被保存之前只保存一定数量的文件丢弃。

# cat /etc/sysconfig/docker 
  OPTIONS='--insecure-registry=172.30.0.0/16 --selinux-enabled --log-opt max size=50m --log-opt max-file=5'

重新启动 docker 服务以使更改生效。

# systemctl restart docker 

如果主机上已经存在需要删除的日志文件,请运行以下命令以清除其内容并减小其大小。

# cat /dev/null > /var/lib/docker/containers/CONTAINER_ID/CONTAINER_ID-json.log

或者

# cat /dev/null >  $(docker inspect --format='{{.LogPath}}'  CONTAINER_ID)

希望这可以帮助!

于 2019-08-27T17:54:15.993 回答