在尝试调试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
这里是我的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
2 回答
而不是
RUN node mongo-setup.js > /var/log/mongo-setup.log 2> /var/log/mongo-setup.error.log
,在容器内,如果你只是说'RUN node mongo-setup.js'怎么办?Docker建议使用
docker logs
. 像这样:要完成你想要的东西(参见mongo安装日志?),你可以通过管道单独的流来拆分容器的stdout和stderr:并将它们发送到文件:
另外,请参阅docker logs documentation
你在构建期间这样做:
创建文件
/var/log/node.log
并将其固定不动地固定到生成的图像中 .然后使用此卷装运行容器:
./mongo/log/
中的任何内容都作为/var/log
安装在容器中,它隐藏了之前的任何内容(来自图像) . 这使得它看起来像你的touch
不起作用(即使它可能工作正常) .你're thinking about this backward - your volume mount doesn' t从外部公开容器的
/var/log
版本 - 它取代了那里的任何东西 .您在Dockerfile(build)中所做的任何事情都不会出现在外部装载中 .