在Dockerfile中运行Java时区更新程序JAR的权限错误
我有一个相当标准的Java图像,添加了一些依赖关系,我正在写这个Dockerfile。 这里是我在Dockerfile中遇到问题的地方:
RUN which java RUN ["/usr/bin/java", "-jar", "tzupdater.jar", "-v", "-l"]
我以为每个Dockerfile命令都是以root身份运行? 但是,当我试图从这个Dockerfile构build,我遇到了这个权限问题,当我忘记运行这个JAR作为sudo
时,也发生在我的本地环境中:
$ docker build -t container-w-tz-update . Uploading context 1.122 GB Uploading context Step 0 : FROM company/java-img-with-dependencies:1.0 ---> 0101010101 ... Step 3 : RUN which java ---> Running in 0101010101 /usr/bin/java ---> 0101010101 Step 4 : RUN ["/usr/bin/java", "-jar", "tzupdater.jar", "-v", "-l"] ---> Running in 0101010101 java.vendor: Sun Microsystems Inc. java.version: 1.6.0_45 tzupdater version 2.1.1-b01 Downloaded file to /tmp/tz.tmp/tzdata.tar.gz Downloaded file to /tmp/tz.tmp/sha512hash failed. Cant rename {0} to {1}. com.sun.tools.tzupdater.TzRuntimeException: com.sun.tools.tzupdater.TzRuntimeException: Cant rename {0} to {1}. Caused by: com.sun.tools.tzupdater.TzRuntimeException: Cant rename {0} to {1}. at com.sun.tools.tzupdater.TimezoneUpdater.update(TimezoneUpdater.java:301) at com.sun.tools.tzupdater.TimezoneUpdater.run(TimezoneUpdater.java:249) at com.sun.tools.tzupdater.TimezoneUpdater.main(TimezoneUpdater.java:643) 2017/04/05 22:20:23 The command [/usr/bin/java -jar tzupdater.jar -v -l] returned a non-zero code: 1
我能够在本地运行这个工具作为sudo
在同一个版本的Java没有问题。 当我试图在没有sudo
情况下在本地运行它时,我收到了同样的错误。 思考?
(这更像是一个评论,但消息长度超出了评论限制,所以我把它留在这里作为答案,以便其他人可以根据我所做的来提供更有用的信息。)
似乎它是一个真正的悬而未决的问题,我通过与root
用户运行的图像enoniccloud/java6
转载您的问题,我也尝试docker run -it --privileged ...
手动运行它,但它没有帮助。 我也试过基本图像alpine:3.3
jdk8
alpine:3.3
但也失败了:
Downloaded file to /tmp/tz.tmp/sha512hash Renaming /opt/jdk1.8.0_91/jre/lib/tzdb.dat to /opt/jdk1.8.0_91/jre/lib/tzdb.dat.tzdata2016a failed. Cant rename {0} to {1}. Validating for : tzdata2017b Validation complete JRE updated to version : tzdata2017b
我search了,我发现的唯一信息如下:
- 一个公开的问题: https : //github.com/docker/hub-feedback/issues/896
- 相关但不一样: https : //forums.docker.com/t/update-docker-container-jre-to-set-timezone-correctly/24426
在find这个问题的根本原因之前,我认为另一种构build图像的方法可能是:
- 为您的平台下载JDK tarball
- 解开它,安装
JAVA_HOME
和PATH
,在你的主机上运行java -jar tzupdater.jar -v -l
- 根据这个更新的JDK构build您的基础映像,
ADD
到映像和设置环境variables,如JAVA_HOME
和PATH
希望这可能对你有帮助:-)
docker build
将完成RUN
步骤作为在Dockerfile中设置的最后一个USER
。
重置:
RUN whoami USER root RUN ["/usr/bin/java", "-jar", "tzupdater.jar", "-v", "-l"] USER "whatever whoami reported"