在docker中重定向命令输出
- 2024-11-06 08:35:00
- admin 原创
- 31
问题描述:
我想对我的服务器进行一些简单的日志记录,我的服务器是一个在 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 重定向到一个文件。现在我运行这个容器并将 shell 放入其中
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 重定向到文件?
解决方案 1:
CMD
当您像在 a 中一样指定 JSON 列表时Dockerfile
,它将不会在 shell 中执行,因此常见的 shell 功能(如 stdout 和 stderr 重定向)将不起作用。
来自文档:
exec 形式被解析为 JSON 数组,这意味着您必须使用双引号 (
"
) 括住单词,而不是单引号 ('
)。与 shell 形式不同,exec 形式不会调用命令 shell。这意味着不会发生正常的 shell 处理。例如,
CMD [ "echo", "$HOME" ]
不会对 进行变量替换$HOME
。如果您想要 shell 处理,则可以使用 shell 形式或直接执行 shell,例如:CMD [ "sh", "-c", "echo", "$HOME" ]
。
您的命令实际上所做的是执行您的index.py
脚本并将字符串"1>server.log"
和"2>server.log"
作为命令行参数传递到该 python 脚本中。
使用下列方法之一(都可以):
CMD "python index.py > server.log 2>&1"
CMD ["/bin/sh", "-c", "python index.py > server.log 2>&1"]
解决方案 2:
docker run
要在 shell 管道中或 shell 重定向下使用,使其run
接受 stdin 并适当地输出到 stdout 和 stderr,请使用以下咒语:
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 \n alpine cat - |
xargs echo This is coming out of docker:
发出:
This is coming out of docker: This was piped into docker
解决方案 3:
只是一个补充,当使用docker-compose时,您还可以尝试:
command: bash -c "script_or_command > /path/to/log/command.log 2>&1"
解决方案 4:
我个人使用:
ENTRYPOINT ["python3"]
CMD ["-u", "-m", "swagger_server"]
“-u” 是关键:)
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件