【问题标题】:Returning log file from process run in docker从 docker 中运行的进程返回日志文件
【发布时间】:2018-01-11 00:06:21
【问题描述】:

我是 docker 的新手,在如何解决这个问题上遇到了麻烦。考虑一下这个超级简化的 cli 工具,它在使用 docker run 运行时会生成日志。

import click
import logging

logging.basicConfig(filename='log.log')
logger = logging.getLogger(__name__)

@click.group()
@click.version_option('1.0')
def cli():
    '''docker_cli with docker test'''


@cli.command('run')
@click.argument('name', default='my name')
def run(name):
    logger.info("running 'run' within docker")
    print('Hello {}'.format(name))

而我的dockerfile如下:

FROM python:3.5-slim

LABEL maintainer="Boudewijn Aasman"
LABEL version="1.0"

ENV config production

RUN mkdir /docker_cli
COPY docker_cli ./docker_cli
COPY setup.py .

RUN python setup.py install

CMD ["cli", "run"]

如果我使用以下方法执行容器:

docker run cli_test cli run world

如何检索在此过程中创建的日志文件?命令打印出“Hello world”后,容器立即退出。我的假设是使用卷,但不确定如何使其工作。

【问题讨论】:

    标签: python docker docker-volume


    【解决方案1】:

    您可以共享本地目录:

    docker run -v full-path-your-local-dir:. cli_test cli run world
    

    或者创建一个 docker 卷

    docker volume create cli_test_volume
    docker run -v cli-test_volume:. cli_test cli run world
    docker volume inspect cli_test_volume # will show where the volume is located.
    

    对于这两种方法,您都需要将日志写入与应用程序不同的路径。否则,应用代码将被共享卷覆盖。

    还有另一种选择,即使用createcp 从容器中复制文件:

    docker create --name cli_test_instance cli_test run world
    docker start  cli_test_instance 
    docker cp cli_test_instance:log.log .
    

    【讨论】:

      【解决方案2】:

      你试过了吗?

      docker logs cli_test
      

      编辑:对不起,我第一次错过了这个,但为了让它工作,你必须登录到 STDERR,而不是登录到日志文件。 (感谢@Gonzalo Matheu 指出这一点。)要让它工作,它应该像做这个小的额外改变一样简单:

      logging.basicConfig()  # note no file name
      

      【讨论】:

      • 为此,应用程序应打印到标准输出,与写入日志文件的内容相同。示例中的情况并非如此。
      • @GonzaloMatheu 你确定吗? The docs 不然的话:"By default, docker logs shows the command’s STDOUT and STDERR"
      • 这正是我要写的。 docker logs 只会显示 print('Hello {}'.format(name)) 而不会显示 logger.info("running 'run' within docker")
      • @GonzaloMatheu 我现在看到了,感谢您指出。我错过了 OP 正在写入日志文件,而不是 STDERR。我会更新我的答案。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-17
      • 2019-12-26
      • 1970-01-01
      • 1970-01-01
      • 2016-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多