Phi*_*ert 8 bash docker dockerfile docker-compose
在尝试调试Dockerfile中的RUN语句时,我尝试将输出重定向到绑定卷(./mongo/log)中的文件.
令我惊讶的是,我无法通过RUN命令创建文件,或者使用重定向/附加(>,>>)运算符将另一个命令的输出传递给文件.然而,我能够通过登录正在运行的容器docker exec -ti mycontainer /bin/sh并从那里发出命令来执行所述任务.
为什么会发生这种情况?如何将Dockerfile/redirect输出中的文件触摸到文件或运行Dockerfile的控制台?
这是我的Dockerfile:
FROM mongo:3.4
#Installing NodeJS
RUN apt-get update && \
apt-get install -y curl && \
curl -sL https://deb.nodesource.com/setup_6.x | bash - && \
apt-get install -y nodejs
#Setting Up Mongo
WORKDIR /var/www/smq
COPY ./mongo-setup.js mongo-setup.js
##for testing
RUN touch /var/log/node.log && /
node --help 2>&1 > /var/log/node.log
##this was the command to debug
#RUN node mongo-setup.js > /var/log/mongo-setup.log 2> /var/log/mongo-setup.error.log
Run Code Online (Sandbox Code Playgroud)
这里是我的docker-compose.yml的摘录:
mongodb:
build:
context: ./
dockerfile: ./mongodb-dockerfile
container_name: smqmongodb
volumes:
- /var/lib/mongodb/data
- ./mongo/log/:/var/log/
- ../.config:/var/www/.config
Run Code Online (Sandbox Code Playgroud)
Dan*_*owe 14
你在构建期间这样做:
RUN touch /var/log/node.log && /
node --help 2>&1 > /var/log/node.log
Run Code Online (Sandbox Code Playgroud)
/var/log/node.log创建文件并将其固定不动地固定到生成的图像中.
然后使用此卷装运行容器:
volumes:
- ./mongo/log/:/var/log/
Run Code Online (Sandbox Code Playgroud)
无论是什么./mongo/log/装/var/log在容器中,它隐藏了之前的任何东西(从图像中).这就是让它看起来像你touch没有工作的东西(即使它可能工作正常).
你正在考虑这个向后 - 你的卷挂载不会暴露容器的/var/log外部版本- 它取代了那里的任何东西.
您在Dockerfile(build)中所做的任何事情都不会出现在外部装载中.
而不是RUN node mongo-setup.js > /var/log/mongo-setup.log 2> /var/log/mongo-setup.error.log在容器内,如果你只是说“运行节点 mongo-setup.js”呢?
Docker 建议使用docker logs. 像这样:
docker logs container-name
Run Code Online (Sandbox Code Playgroud)
为了完成你所追求的(参见 mongo 设置日志?),你可以通过管道分离流来拆分容器的 stdout 和 stderr: 并将它们发送到文件:
me@host~$ docker logs foo > stdout.log 2>stderr.log
me@host~$ cat stdout.log
me@host~$ cat stderr.log
Run Code Online (Sandbox Code Playgroud)
另外,请参阅docker 日志文档
| 归档时间: |
|
| 查看次数: |
6987 次 |
| 最近记录: |