Docker: Correct environment for docker exec calls

Provide way to clean QtcProcess environment which is needed as
e.g. toolchains, build tools, and debugger otherwise run
inside a wrong environment when using docker exec for the
respective process calls.

Change-Id: Ia6de1c90f2134fce260d293a2f6937ab3cfca2ce
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Christian Stenger
2021-07-23 11:13:59 +02:00
parent 98ae0d44e6
commit b8bcdd9568
3 changed files with 19 additions and 0 deletions

View File

@@ -259,6 +259,12 @@ void QtcProcess::setEnvironment(const Environment &env)
d->m_haveEnv = true;
}
void QtcProcess::unsetEnvironment()
{
d->m_environment = Environment();
d->m_haveEnv = false;
}
const Environment &QtcProcess::environment() const
{
return d->m_environment;

View File

@@ -80,6 +80,7 @@ public:
};
void setEnvironment(const Environment &env);
void unsetEnvironment();
const Environment &environment() const;
void setCommand(const CommandLine &cmdLine);

View File

@@ -1396,12 +1396,24 @@ void DockerDevice::runProcess(QtcProcess &process) const
const FilePath workingDir = process.workingDirectory();
const CommandLine origCmd = process.commandLine();
const Environment env = process.environment();
CommandLine cmd{"docker", {"exec"}};
if (!workingDir.isEmpty())
cmd.addArgs({"-w", workingDir.path()});
if (process.keepsWriteChannelOpen())
cmd.addArg("-i");
if (env.size() != 0 && d->m_accessible != DockerDevicePrivate::Accessible) {
process.unsetEnvironment();
// FIXME the below would be probably correct if the respective tools would use correct
// environment already, but most are using the host environment which usually makes
// no sense on the device and may degrade performance
// const QStringList envList = env.toStringList();
// for (const QString &keyValue : envList) {
// cmd.addArg("-e");
// cmd.addArg(keyValue);
// }
}
cmd.addArg(d->m_container);
cmd.addArg(origCmd.executable().path()); // Cut off the docker://.../ bits.
cmd.addArgs(origCmd.splitArguments(osType()));