我设置了一个简单的测试环境。

Dockerfile

FROM ubuntu:16.04
COPY test.sh /
ENTRYPOINT /test.sh

test.sh
#!/bin/bash
while true; do
    echo "test..."
    sleep 5
done

docker-compose.yml
version: '3.4'

services:

    test:
        image: asleea/simple_test
        entrypoint: ["/test.sh", ">", "test.log"]
        # command: [">", "/test.log"]
        container_name: simple_test

运行测试容器
$docker-compose up
WARNING: The Docker Engine you're using is running in swarm mode.

Compose does not use swarm mode to deploy services to multiple nodes in a swarm. All containers will be scheduled on the current node.

To deploy your application across the swarm, use `docker stack deploy`.

Starting simple_test ...
Starting simple_test ... done
Attaching to simple_test
simple_test | test...
simple_test | test...
  • 它仍在打印stdout


  • 检查容器中的test.log
    $ docker exec -it simple_test bash
    $ cd /
    $ ls
    # No file named `test.log`
    

    重定向的
  • test.log不存在。
  • docker似乎只是忽略重定向。这正常吗?为什么?还是我做错事了?

    编辑

    谢谢@塞巴斯蒂安的回答。它可以将stdout重定向到文件。
    但是,还有一个问题。

    您引用的docs也说以下内容。



    据我了解,command: /test.sh > /test.logcommand: ["sh", "-c", "/test.sh > /test.log"]等效。

    但是,当我执行command: /test.sh > /test.log时,它也没有重定向。

    为什么command: ["sh", "-c", "/test.sh > /test.log"]但是command: /test.sh > /test.log可以工作。

    我会误会吗?

    最佳答案

    您需要确保命令在 shell 中执行。尝试使用:

    CMD [ "sh", "-c", "/test.sh", ">", "test.log" ]
    

    您将命令/入口点指定为JSON,称为exec形式



    Docker docs

    关于docker - 为什么将容器标准输出重定向到文件不起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48146964/

    10-16 16:30