【问题标题】:Failed docker build has no logs - "configured logging driver does not support reading"失败的 docker build 没有日志 - “配置的日志记录驱动程序不支持读取”
【发布时间】:2019-09-10 17:37:28
【问题描述】:

我正在尝试在 Digital Ocean 液滴上调试 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" ]

---詹金斯文件---

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 logging digital-ocean


    【解决方案1】:

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

    希望这能让它更清楚。

    【讨论】:

    • 感谢米海的回复。这确实有道理。提供更多信息;每当我推送到 github 时,我都会将 jenkins 用于 CI。我让詹金斯执行构建然后运行容器。关于不建立在液滴上的观点,在使用詹金斯时如何避免这种情况?
    • 您可以将 Jenkins 放在一个特殊的构建 droplet 上,并专门为此任务提供更多内存,或者只将 Jenkins 放在另一台机器上。您甚至可以在自己的机器上的 docker 中启动 Jenkins 并在那里运行它
    • 嗯,所以我为 jenkins 创建了一个新的 droplet,我的步骤可能如下所示:1)在该 droplet 上构建图像。 2)将其推送到注册表。 3)从詹金斯液滴以某种方式命令另一个液滴从注册表中拉出并运行新容器? (我添加了我当前的 jenkinsfile 和 dockerfile 以供参考原帖)
    • 只是为了让它现在工作,我最终添加了交换空间。 digitalocean.com/community/tutorials/…
    猜你喜欢
    • 2019-02-18
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2015-12-17
    相关资源
    最近更新 更多