在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_HOMEPATH ,在你的主机上运行java -jar tzupdater.jar -v -l
  • 根据这个更新的JDK构build您的基础映像, ADD到映像和设置环境variables,如JAVA_HOMEPATH

希望这可能对你有帮助:-)

docker build将完成RUN步骤作为在Dockerfile中设置的最后一个USER

重置:

 RUN whoami USER root RUN ["/usr/bin/java", "-jar", "tzupdater.jar", "-v", "-l"] USER "whatever whoami reported"