失败的Docker构建没有日志-“配置的日志记录驱动程序不支持读取”

时间:2019-04-21 00:40:41

标签: docker logging digital-ocean

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

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

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

我知道这与内存不足有关,但是我不仅想增加液滴上的RAM,还想了解是否可以优化图像。 (Sort of following this guide

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

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

因此,我尝试通过使用以下代码将daemon.json文件添加到/etc/dockerconfigure the logging driver

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

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

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

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

当我尝试通过运行以下命令来检查容器正在使用的日志记录驱动程序时:docker inspect -f '{{.HostConfig.LogConfig.Type}}' 3016507bd1dc,我收回了none

有人丢失了我的东西或如何获取失败构建的日志吗?

--- dockerfile ---

具有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" ]

--- jenkinsfile ---

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'
      }
    }
  }
}

1 个答案:

答案 0 :(得分:1)

即使在能够分配日志记录驱动程序之前,Docker很可能也已进入OOM。无论如何,查看日志都不是调试构建的一种方法。 Docker在构建过程中会打印消息,这就是您应该使用的消息。 最重要的是,您不应建立在小滴上。您应该在本地构建,推送到注册表并仅使用Droplet运行容器。 但是,您可以发布Dockerfile,我可以告诉您是否仍然可以对其进行优化。

希望这更加清楚。