写入docker容器上的文件会出错:没有这样的文件或目录

时间:2016-06-23 21:21:29

标签: docker

我正在尝试执行以下命令:

docker exec mydocker echo "hello" >> /usr/local/src/scores.txt

但它给了我以下错误:

No such file or directory

但是使用以下命令:

docker exec -it mydocker bash

我确保文件确实存在于那里。我在这里找不到什么东西吗?

由于

2 个答案:

答案 0 :(得分:3)

尝试在命令字符串中包装echo命令:

public static readonly BindableProperty CommandProperty = BindableProperty.Create("Command", typeof(ICommand), typeof(Button), null, propertyChanged: (bo, o, n) => ((Button)bo).OnCommandChanged());

public static readonly BindableProperty CommandParameterProperty = BindableProperty.Create("CommandParameter", typeof(object), typeof(Button), null,
            propertyChanged: (bindable, oldvalue, newvalue) => ((Button)bindable).CommandCanExecuteChanged(bindable, EventArgs.Empty));

public ICommand Command
        {
            get { return (ICommand)GetValue(CommandProperty); }
            set { SetValue(CommandProperty, value); }
        }

        public object CommandParameter
        {
            get { return GetValue(CommandParameterProperty); }
            set { SetValue(CommandParameterProperty, value); }
        }

public event EventHandler Clicked;
void IButtonController.SendClicked()
        {
            ICommand cmd = Command;
            if (cmd != null)
                cmd.Execute(CommandParameter);

            EventHandler handler = Clicked;
            if (handler != null)
                handler(this, EventArgs.Empty);
        }

使用以下方式验证文件内容:

docker exec mydocker sh -c 'echo "hello" >> /usr/local/src/scores.txt'

答案 1 :(得分:1)

有一个很好的理由:它被解释为两个命令。

解决方案就像发布的stacksonstacks一样 - 将容器命令包装在一个shell命令中:

    docker exec mydocker sh -c 'echo "hello" >> /usr/local/src/scores.txt'

但为什么会这样呢?

关键是你使用了bash运算符。与您运行类似的任何时间类似:

    echo one two >> file.txt

“>>” operator不作为echo的参数传递(如“one”和“two”do)。而是执行echo命令并将其输出附加到文件中。

在这种情况下,“>>”运算符对docker exec执行相同操作,并尝试将结果输出到/usr/local/src/scores.txt并报告该目录不存在(在主机上,而不是容器上)。

这意味着如果你跑了:

    docker exec mydocker echo "hello" >> scores.txt

你会在主机上找到scores.txt,包含“hello” - 来自容器上运行的命令的输出。 并作为最后的测试尝试:

    docker exec cf65263ed353 hostname && hostname

您将看到它打印容器的主机名(其哈希ID),然后是您自己的主机名。第二个命令在主机上运行。