在docker中重定向命令输出

新手上路,请多包涵

我想为我的服务器做一些简单的日志记录,这是一个在 Docker 容器中运行的小型 Flask 应用程序。

这是 Dockerfile

 # Dockerfile
FROM dreen/flask
MAINTAINER dreen
WORKDIR /srv

# Get source
RUN mkdir -p /srv
COPY perfektimprezy.tar.gz /srv/perfektimprezy.tar.gz
RUN tar x -f perfektimprezy.tar.gz
RUN rm perfektimprezy.tar.gz

# Run server
EXPOSE 80
CMD ["python", "index.py", "1>server.log", "2>server.log"]

正如您在最后一行看到的,我将 stderr 和 stdout 重定向到一个文件。现在我在其中运行这个容器和外壳

docker run -d -p 80:80 perfektimprezy
docker exec -it "... id of container ..." bash

并观察以下事项:

服务器正在运行并且网站正在运行

没有 /srv/server.log

ps aux | grep python 产生:

 root         1  1.6  3.2  54172 16240 ?        Ss   13:43   0:00 python index.py 1>server.log 2>server.log
root        12  1.9  3.3 130388 16740 ?        Sl   13:43   0:00 /usr/bin/python index.py 1>server.log 2>server.log
root        32  0.0  0.0   8860   388 ?        R+   13:43   0:00 grep --color=auto python

但是没有日志……但是,如果我 docker attach 到容器,我可以看到应用程序在控制台中生成输出。

使用 Docker 时如何正确地将 stdout/err 重定向到文件?

原文由 Dreen 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.1k
2 个回答

当您在 --- 中将 JSON 列表指定为 CMD Dockerfile 时,它将不会在 shell 中执行,因此通常的 shell 函数(如 stdout 和 stderr 重定向)将不起作用。

文档 中:

exec 形式被解析为 JSON 数组,这意味着您必须在单词周围使用双引号 ( " ) 而不是单引号 ( ' )。

与 shell 形式不同,exec 形式不调用命令 shell。这意味着不会发生正常的外壳处理。例如, CMD [ "echo", "$HOME" ] 不会对 $HOME 进行变量替换。如果要进行 shell 处理,则使用 shell 形式或直接执行 shell,例如: CMD [ "sh", "-c", "echo", "$HOME" ]

您的命令实际执行的是 执行您的 index.py 脚本并将字符串 "1>server.log""2>server.log" 作为命令行参数传递到该 python 脚本 中。

改用以下方法之一(两者都应该工作):

  1. CMD "python index.py > server.log 2>&1"
  2. CMD ["/bin/sh", "-c", "python index.py > server.log 2>&1"]

原文由 helmbert 发布,翻译遵循 CC BY-SA 4.0 许可协议

要在 shell 管道或 shell 重定向下使用 docker run ,使 run 接受标准输入并适当地输出到标准输出和标准错误,请使用以下咒语:

 docker run -i --log-driver=none -a stdin -a stdout -a stderr ...

例如,在包含的环境中运行 alpine 映像并执行 UNIX 命令 cat

 echo "This was piped into docker" |
  docker run -i --log-driver=none -a stdin -a stdout -a stderr \
    alpine cat - |
  xargs echo This is coming out of docker:

发出:

 This is coming out of docker: This was piped into docker

原文由 Daniel S. Sterling 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题