有什么办法可以从Docker容器运行“ pkexec”吗?

时间:2019-06-24 11:38:33

标签: docker polkit

我正在尝试使用旧版本的Firefox和旧版本的Java来设置Docker映像(我的Dockerfile可以在这里使用,对不起,法语README:https://framagit.org/Gwendal/firefox-icedtea-docker),以运行旧的Java applet来运行启动VPN。我的图像可以正常工作,并且可以成功地在Firefox中启动Java小程序。

不幸的是,该applet然后尝试在容器中运行以下命令(我只是从命令中删除了--config部分,因为这里无关紧要):

INFO: launching '/usr/bin/pkexec sh -c /usr/sbin/openvpn --config ...'

然后,小程序以错误方式静默退出。在调查过程中,我尝试使用具有相同Docker映像的pkexec运行命令,并且得到以下结果:

$ sudo docker-compose run firefox pkexec /firefox/firefox-sdk/bin/firefox-bin -new-instance
**
ERROR:pkexec.c:719:main: assertion failed: (polkit_unix_process_get_start_time (POLKIT_UNIX_PROCESS (subject)) > 0)

但是我一点都不了解polkit,也无法理解这个错误。


编辑:重现问题的更简单方法是使用此Dockerfile:

FROM ubuntu:16.04

RUN apt-get update \
    && apt-get install -y policykit-1

然后运行:

$ sudo docker build -t pkexec-test .
$ sudo docker run pkexec-test pkexec echo Hello

其中又一次导致:

ERROR:pkexec.c:719:main: assertion failed: (polkit_unix_process_get_start_time (POLKIT_UNIX_PROCESS (subject)) > 0)

我是否应该得出结论,pkexec无法在Docker容器中工作?还是有什么方法可以使该命令起作用?

Sidenote :我对尝试运行的Java applet毫无控制,这是我应该在工作中使用的可怕且过时的专有黑匣子,为此无法访问源代码,必须按原样使用。

1 个答案:

答案 0 :(得分:0)

我已经解决了自己的问题,方法是在Docker映像中将pkexec替换为sudo,并允许使用无密码的sudo。

给出一个创建了名为developer的用户并使用USER语句配置的ubuntu docker镜像,添加以下行:

# Install sudo and make 'developer' a passwordless sudoer
RUN apt-get install sudo
ADD ./developersudo /etc/sudoers.d/developersudo

# Replacing pkexec by sudo
RUN rm /usr/bin/pkexec
RUN ln -s /usr/bin/sudo /usr/bin/pkexec

文件developersudo包含:

developer ALL=(ALL) NOPASSWD:ALL

此操作将通过在没有任何密码提示的情况下调用pkexec来代替在容器中运行的进程中对sudo的任何调用,效果很好。