我试图在已经运行的容器上运行带有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命令(在容器内)答案 0 :(得分:1)
您做得很对。但是您将shell命令与linux可执行文件混淆了。 exec_create
和exec_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