Docker:RUN touch不会创build文件

在尝试debuggingDockerfile中的RUN语句时,我试图将输出redirect到绑定卷( ./mongo/log )中的文件。

令我惊讶的是,我无法通过RUN命令创build文件,或者使用redirect/附加( >>> )操作符将另一个命令的输出传送到文件。 然而,我可以通过docker exec -ti mycontainer /bin/shlogin正在运行的容器并从那里发出命令来执行上述任务。

为什么会发生这种行为? 如何将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 

在容器内,而不是RUN node mongo-setup.js > /var/log/mongo-setup.log 2> /var/log/mongo-setup.error.log ,如果只是说`RUN node mongo-setup .js文件?

Dockerbuild议使用docker logs 。 像这样:

 docker logs container-name 

要完成你以后的工作(请参阅mongo安装日志?),可以通过pipe道分离的stream来分割容器的stdout&stderr:并将它们发送到文件:

 me@host~$ docker logs foo > stdout.log 2>stderr.log me@host~$ cat stdout.log me@host~$ cat stderr.log 

另外,请参阅docker日志文档

你在构build过程中正在这样做:

 RUN touch /var/log/node.log && / node --help 2>&1 > /var/log/node.log 

文件/var/log/node.log被创build并固定地固定在结果图像中。

然后你用这个卷装运行容器:

 volumes: - ./mongo/log/:/var/log/ 

无论在./mongo/log/中,它都被挂载为容器中的/var/log ,从而隐藏了之前(从映像中)的任何内容。 这是使它看起来像你的touch无法正常工作(即使它可能工作正常)。

你正在考虑这个问题 – 你的卷挂载不会在外部暴露容器的/var/log版本 – 它将取代那里的任何东西。

你在Dockerfile(build)中所做的任何事情都不会在外部挂载中显示出来。