在Dockerfile中运行Java Timezone Updater JAR的权限错误

时间:2017-04-05 22:36:51

标签: java docker dockerfile

我有一个相当标准的Java映像,其中添加了一些依赖项,我将这个Dockerfile写在上面。这是我在Dockerfile中遇到问题的地方:

RUN which java
RUN ["/usr/bin/java", "-jar", "tzupdater.jar", "-v", "-l"]

我认为每个Dockerfile命令都是以root身份运行的?但是当我尝试从这个Dockerfile构建时,我遇到了这个权限问题,当我忘记以sudo运行这个JAR时,这也发生在我的本地环境中:

$ 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的情况下在本地运行它时,我收到了同样的错误。想法?

3 个答案:

答案 0 :(得分:1)

(这更像是评论,但消息长度超出了评论限制,所以我把它留在这里作为答案,以便其他人可以根据我做的事情提供更多有用的信息。)

似乎它确实是一个尚未解决的问题,我通过与enoniccloud/java6用户一起运行的图片root重现了您的问题,我也尝试docker run -it --privileged ...手动运行它,但它没有救命。我还尝试使用基本图片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

我搜索过,我找到的唯一信息如下:

在找到此问题的根本原因之前,我认为构建图像的另一种方法可能是:

  • 为您的平台下载JDK tarball
  • 解开它,设置JAVA_HOMEPATH,在您的主机上运行java -jar tzupdater.jar -v -l
  • 根据此更新的JDK ADD构建基础映像,以映像和设置环境变量,如JAVA_HOMEPATH

希望这对你有所帮助: - )

答案 1 :(得分:0)

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

要重置:

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

答案 2 :(得分:0)

我有一个解决方法。添加一些[7, 7] 命令(没有实际效果)可以使其工作:

 <httpCookies httpOnlyCookies="true" requireSSL="true" sameSite="None" />
 <sessionState timeout="20" cookieSameSite="None" />
    <httpRuntime targetFramework="4.8" />
    <compilation debug="true" targetFramework="4.8" />

我不知道它为什么起作用,是通过反复试验得到的。

请注意,两个mv命令的作用与FROM openjdk:7u211-jdk-alpine3.9 ADD tzupdater.jar tzupdater.jar RUN mv /usr/lib/jvm/java-1.7-openjdk/jre/lib/zi /usr/lib/jvm/java-1.7-openjdk/jre/lib/zi.tzdata2018g && \ mv /usr/lib/jvm/java-1.7-openjdk/jre/lib/zi.tzdata2018g /usr/lib/jvm/java-1.7-openjdk/jre/lib/zi && \ java -jar tzupdater.jar -v -l https://.../tzdata-latest.tar.gz 相似,因此没有任何实际变化。

mv中使用的文件名(实际上是目录)是错误时输出的文件名(在解决方法之前),因此请相应地进行更改。