在Dockerfile中运行Java时区更新程序JAR时出现权限错误

在Dockerfile中运行Java时区更新程序JAR时出现权限错误,java,docker,dockerfile,Java,Docker,Dockerfile,我有一个相当标准的Java映像,其中添加了一些依赖项,我正在上面编写这个Dockerfile。下面是我在Dockerfile中遇到的问题: RUN which java RUN ["/usr/bin/java", "-jar", "tzupdater.jar", "-v", "-l"] 我以为每个Dockerfile命令都是以root用户身份运行的?但是当我尝试从这个Dockerfile构建时,我遇到了权限问题,当我忘记以sudo的身份运行这个JAR时,在我的本地环境中也发生了这个问题: $

我有一个相当标准的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

我可以在本地使用完全相同的Java版本作为
sudo
运行此实用程序,没有任何问题。当我尝试在没有
sudo
的情况下在本地运行它时,我收到了相同的错误。想法?

docker build
将作为Dockerfile中设置的最后一个
用户完成
运行
步骤

要重置:

RUN whoami
USER root
RUN ["/usr/bin/java", "-jar", "tzupdater.jar", "-v", "-l"]
USER "whatever whoami reported"
(这更像是一条评论,但消息长度超出了评论限制,因此我将其保留在这里作为答案,以便其他人可以根据我所做的提供更多有用的信息。)

似乎这真的是一个未解决的问题,我通过image
enoniccloud/java6
root
用户一起运行重现了您的问题,我还尝试了
docker run-it--privileged…
手动运行它,但没有帮助。我还尝试了使用基本映像
alpine:3.3
jdk8
,但也失败了:

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_HOME
    PATH
    ,在主机上运行
    JAVA-jar tzupdater.jar-v-l
  • 基于此更新的JDK构建您的基础映像,
    向映像添加
    ,并设置环境变量,如
    JAVA\u HOME
    PATH

希望这能对您有所帮助:-)

我找到了解决方法。添加一些
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
命令类似于
mva b和&mv b a
,因此实际上没有任何变化


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

您可以发布您的基本图像摘要文件吗?那么
tzupdater.jar
实际上会做什么呢?@shizhz tzupdater.jar是Oracle提供的一个实用程序,用于更新Java标准库中的时区数据。它应该适用于Java1.5到1.8。明天我会在工作中发布一个完整的Dockerfile。感谢您提供的信息,并对缺乏
tzupdater.jar
的知识表示抱歉,我将尝试一下,看看是否可以重现您的问题:-)