Docker:RUN touch不会创建文件

时间:2017-01-01 01:39:41

标签: bash docker docker-compose dockerfile

在尝试调试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 个答案:

答案 0 :(得分:13)

你在构建过程中这样做:

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

创建文件/var/log/node.log并将其固定不动地固定到生成的图像中。

然后使用此卷装载运行容器:

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

./mongo/log/中的任何内容都以/var/log的形式挂载在容器中,隐藏了之前的任何内容(来自图像)。这使得它看起来像touch不起作用(即使它可能工作正常)。

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

你在Dockerfile(build)中所做的任何事情都不会出现在外部装载中。

答案 1 :(得分:4)

Instead of RUN node mongo-setup.js > /var/log/mongo-setup.log 2> /var/log/mongo-setup.error.log, within the container, what if you just say `RUN node mongo-setup.js'?

Docker recommends using docker logs. Like so:

docker logs container-name

To accomplish what you're after (see the mongo setup logs?), you can split the stdout & stderr of the container by piping the separate streams: and send them to files:

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

me@host~$ cat stdout.log
me@host~$ cat stderr.log

Also, refer to the docker logs documentation

的内容