简体   繁体   中英

Executing shell command using docker-py

I'm trying to run a shell command with docker-py on an already-running container, but get an error:

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

here's how I wrote the script:

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

so my question is how can I run a shell command (inside the container) using docker-py?

You did it quite right. But you confused shell commands with linux executables. exec_create and and exec_start are all about running executables. Like for example bash. export in your example is a shell command. You can only use it in a shell like bash running inside the container.

Additionally what you are trying to achieve (setting a environment variable) is not going to work. As soon as your exec finishes (where you set the env var) the exec process will finish and its environment is been torn down.

You can only create global container environment variables upon creation of a container. If you want to change the env vars, you have to tear down the container and recreate it with your new vars. As you probably know, all data in the container is lost upon a remove unless you use volumes to store your data. Reconnect the volumes on container creation.

That said your example was nearly correct. This should work and create an empty /somefile.

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

To execute shell commands, use this example. It calls sh and tells it to run the interpreter on the given command string (-c)

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

For actually , when execute cmd docker exec in docker container export MYENV=1 . It will fail and report this error

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

Because export is a shell builtin, could run the cmd in shell.

whereis export
type export

can not find export in /usr/bin/ or somewhere else.

There is some ways to pass through this problem.

case1: use -c parameter

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

case2: append export cmds to a rcfile, then use this file.

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

case3: open a terminal, then enter the cmds to export env parameters , then open a new terminal, the env parameters will work.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM