Docker:RUN touch不会创建文件

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)中所做的任何事情都不会出现在外部装载中.

  • 你的答案是啊哈!片刻。很好的解释。清晰,简洁,切中要害。现在我明白@Bruno Reis 在 OP 下的评论中的意思了。最终,由于苏格拉底的回答为我的日志记录问题提供了解决方案,因此我将他作为公认的解决方案。但是,您的回答同样有用且有价值。干杯! (2认同)

Soc*_*lai 5

而不是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 日志文档