Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用docker py执行shell命令_Python_Docker_Dockerpy - Fatal编程技术网

Python 使用docker py执行shell命令

Python 使用docker py执行shell命令,python,docker,dockerpy,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命令(在容器内)?

我试图在已经运行的容器上使用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命令(在容器内)?

您做得非常正确。但是您混淆了shell命令和linux可执行文件
exec\u create
exec\u start
都是关于运行可执行文件的。比如bash<代码>导出在您的示例中是一个shell命令。您只能在容器内运行的类似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)上运行解释器


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

exec:“导出”:在$PATH中找不到可执行文件
因为导出是shell内置的,所以可以在shell中运行cmd

导出在哪里
类型导出
/usr/bin/
或其他地方找不到
导出

有一些方法可以解决这个问题

案例1:使用
-c
参数

/bin/bash-c'export MYENV=1/bin/bash'
案例2:将导出cmds附加到RCF文件,然后使用此文件

echo“exprot MYENV=1”>>/bin/bash--rcfile
案例3:打开一个终端,然后输入cmds以导出环境参数,然后打开一个新终端,环境参数将起作用

/bin/bash
exprot MYENV=1
/bin/bash#打开一个新的终端

您想用它实现什么?即使它确实起作用(您可能需要使用
bash-c
作为前缀),那么变量也会在子进程中导出,而不会在其他地方导出。可能使用
os.environ[MYENV]=“1”
?不确定如何在容器内使用
os.environ[MYENV]
export
只是一个例子,我想在容器内运行一个shell命令。最后,我需要在容器内设置一个env变量,并在容器内运行psql(然后运行一些查询)。但第一步是使用docker py在容器内运行shell命令本身。还不确定如何通过docker py和
exec_create
cmd='bash-c“export MYENV=1”前缀
bash-c
如果您可以控制启动容器,则可以使用
docker.client.containers.run的
environment
参数设置环境变量。
exe = client.exec_create(container=my_container, 
                         cmd=['/bin/sh', '-c' 'touch /somefile && mv /somefile /bla'])
res = client.exec_start(exec_id=exe)