在Dockerfile中运行Java时区更新程序JAR时出现权限错误
我有一个相当标准的Java映像,其中添加了一些依赖项,我正在上面编写这个Dockerfile。下面是我在Dockerfile中遇到的问题:在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时,在我的本地环境中也发生了这个问题: $
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"
(这更像是一条评论,但消息长度超出了评论限制,因此我将其保留在这里作为答案,以便其他人可以根据我所做的提供更多有用的信息。)
似乎这真的是一个未解决的问题,我通过imageenoniccloud/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
的知识表示抱歉,我将尝试一下,看看是否可以重现您的问题:-)