失败 docker 构建没有日志 - "configured logging driver does not support reading"

Failed docker build has no logs - "configured logging driver does not support reading"

我正在尝试调试基于 Digital Ocean droplet 的 docker 构建,但我似乎无法访问任何日志。

当我 运行 构建命令时,它 returns 退出代码 137。这是我的构建命令:

docker build --build-arg env=staging -t name:tag .

我知道这与内存不足有关,但我想看看是否可以优化图像,而不是仅仅增加 droplet 上的 RAM。 (Sort of following this guide)

我可以通过 运行ning docker ps -a 找到退出的容器,但是当我尝试通过 运行ning docker logs <CONTAINTER_ID> 访问日志时,我收到以下错误:

Error response from daemon: configured logging driver does not support reading

所以我尝试 configure the logging driver 通过使用以下代码将 daemon.json 文件添加到 /etc/docker

{
  "log-driver": "json-file"
}

当我检查 运行 docker info --format '{{.LoggingDriver}}' 时,我返回 json-file - 据我所知这是当前默认的日志记录驱动程序。

但是当我再次尝试构建图像时(它不起作用,如预期的那样出现 137 错误),当我尝试访问日志时仍然遇到相同的错误:

Error response from daemon: configured logging driver does not support reading

当我尝试通过 运行ning 检查容器正在使用的日志记录驱动程序时:docker inspect -f '{{.HostConfig.LogConfig.Type}}' 3016507bd1dc 我得到了 none

有人知道我遗漏了什么吗?或者我该如何获取失败构建的日志?

--- docker文件 ---

具有 Angular 客户端的节点应用程序

FROM node:11.14

ARG env
ENV NODE_ENV $env

# Create app directory
WORKDIR /usr/src/app

# Install app dependencies
COPY package*.json ./
COPY ./client/ ./client/

RUN npm install

WORKDIR /usr/src/app/client
RUN npm install && \
    npm install --only=dev && \
    npm install -g @angular/cli --unsafe && \
    npm rebuild node-sass && \
    ng build --configuration=$env
WORKDIR /usr/src/app

# Bundle app source
COPY . .

EXPOSE 3040
CMD [ "npm", "start" ]

--- 詹金斯文件 ---

pipeline {
  agent any
  stages {
    stage('clean') {
      steps {
        sh 'docker system prune -a -f || true'
      }
    }
    stage('build staging') {
      when {
        branch 'dev'
      }
      steps {
        sh '''docker build --build-arg env=staging -t NAME:stage .
  docker stop NAME-stage-c && docker rm NAME-stage-c || true
  docker run -d -p 3041:3040 --name NAME-stage-c NAME:stage
  '''
      }
    }
    stage('cleanup') {
      steps {
        sh 'docker system prune -a -f || true'
      }
    }
  }
}

很可能 Docker 甚至在能够分配日志记录驱动程序之前就进入了 OOM。在任何情况下,查看日志都不是调试构建的方法。 Docker 在构建过程中打印消息,这就是您应该使用的。 最重要的是,你不应该建立在液滴上。您应该在本地构建,推送到注册表并仅将 Droplet 用于 运行 容器。 但是,您可以 post 您的 Docker 文件,我可以告诉您它是否仍然可以优化。

希望这能让它更清楚。