我正在尝试使用旧版本的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毫无控制,这是我应该在工作中使用的可怕且过时的专有黑匣子,为此无法访问源代码,必须按原样使用。
答案 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
的任何调用,效果很好。