使用docker-py执行shell命令

时间:2016-09-18 17:32:25

标签: python docker dockerpy

我试图在已经运行的容器上运行带有docker-py的shell命令,但是收到错误:

exec: "export": executable file not found in $PATH

这是我编写脚本的方式:

exe = client.exec_create(container=my_container, cmd='export MYENV=1')
res = client.exec_start(exec_id=exe)

所以我的问题是如何使用docker-py?

运行shell命令(在容器内)

2 个答案:

答案 0 :(得分:1)

您做得很对。但是您将shell命令与linux可执行文件混淆了。 exec_createexec_start都是关于运行可执行文件的。例如bash。您的示例中的export是一个shell命令。您只能在容器内部运行的bash这样的外壳中使用它。

此外,您要实现的目标(设置环境变量)将无法正常工作。一旦您的exec完成(您在其中设置env var),该exec进程即会结束,其环境也将被拆除。

您只能在创建容器时创建全局容器环境变量。如果要更改环境变量,则必须拆除容器并使用新的变量来重新创建容器。您可能知道,容器中的所有数据在删除后都会丢失,除非您使用卷来存储数据。在创建容器时重新连接卷。

那说明您的例子几乎是正确的。这应该可以工作并创建一个空的/ somefile。

exe = client.exec_create(container=my_container, cmd=['touch', '/somefile'])
res = client.exec_start(exec_id=exe)

要执行shell命令,请使用以下示例。它调用sh并告诉它在给定的命令字符串(-c)上运行解释器

exe = client.exec_create(container=my_container, 
                         cmd=['/bin/sh', '-c' 'touch /somefile && mv /somefile /bla'])
res = client.exec_start(exec_id=exe)

答案 1 :(得分:0)

实际上,在docker容器docker exec中执行cmd export MYENV=1时。它将失败并报告此错误

exec: "export": executable file not found in $PATH

由于export是内置的shell,因此可以在shell中运行cmd。

whereis export
type export

export或其他地方找不到/usr/bin/

有一些方法可以解决此问题。

情况1:使用-c参数

/bin/bash -c 'export MYENV=1 ; /bin/bash'

case2:将export cmds附加到rcfile,然后使用此文件。

echo "exprot MYENV=1" >> <some_file_path> ; /bin/bash --rcfile <some_file_path>

情况3:打开一个终端,然后输入cmds以导出环境参数,然后打开一个新终端,环境参数将起作用。

/bin/bash
exprot MYENV=1
/bin/bash # open a new terminal