首页 文章

Docker:RUN touch不会创建文件

提问于
浏览
7

在尝试调试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 回答

  • 10

    而不是 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 . 像这样:

    docker logs container-name
    

    要完成你想要的东西(参见mongo安装日志?),你可以通过管道单独的流来拆分容器的stdout和stderr:并将它们发送到文件:

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

    另外,请参阅docker logs documentation

  • 4

    你在构建期间这样做:

    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 不起作用(即使它可能工作正常) .

    你're thinking about this backward - your volume mount doesn' t从外部公开容器的 /var/log 版本 - 它取代了那里的任何东西 .

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

相关问题