无法生成Docker映像
无法生成下面的映像,因为此映像不支持shell形式,并且只支持exec形式,因此运行和入口点仅支持向量形式。请建议如何建立准确的形象,因为它是重要的使用这一个无法生成Docker映像,docker,dockerfile,Docker,Dockerfile,无法生成下面的映像,因为此映像不支持shell形式,并且只支持exec形式,因此运行和入口点仅支持向量形式。请建议如何建立准确的形象,因为它是重要的使用这一个 FROM gcr.io/distroless/java:8 RUN apt-get update && apt-get install -y --no-install-recommends \ curl \ && rm -rf /aaa/bbb/* COPY target/${JAR_F
FROM gcr.io/distroless/java:8
RUN apt-get update && apt-get install -y --no-install-recommends \
curl \
&& rm -rf /aaa/bbb/*
COPY target/${JAR_FILE} /xyz/yy.jar
ENTRYPOINT exec java $JAVA_OPTS -Djdk.tls.client.protocols="tls" -jar /xyz/yy.jar $0 $@
另外,当我尝试指定以向量形式运行时,我会得到“exec:”apt get“在$PATH中找不到可执行文件”。$@代码>在这里使用似乎有点奇怪
ENTRYPOINT
正在配置容器作为可执行文件运行,允许CMD
为可执行文件提供默认参数,因此使用$0$@
是100%不必要的
虽然我没有任何Java可供使用,但从理论上讲,类似这样的东西应该是可行的:
ARG JAR_FILE=build/*.jar
FROM gcr.io/distroless/java:8
RUN export DEBIAN_FRONTEND=noninteractive \
&& apt-get update \
&& apt-get install -qqy --no-install-recommends \
curl \
&& rm -rf /var/lib/apt/lists/*```
COPY ${JAR_FILE} app.jar
ENV JAVA_OPTS="-Djdk.tls.client.protocols=tls"
ENTRYPOINT ["java", "-jar", "$JAVA_OPTS", "-jar", "app.jar"]
# By providing an entrypoint above, your CMD can optionally define any default
# arguments you might want to fallback to.
# CMD [ "--java", "--things" ]
然而,最重要的是利用CMD
作为exec
,并且在这种类型的使用中根本不包括ENTRYPOINT
。然后,您的整个CMD
是可定制的,您可以不再需要$JAVA\u OPTS
:
ARG JAR_FILE=build/*.jar
FROM gcr.io/distroless/java:8
RUN export DEBIAN_FRONTEND=noninteractive \
&& apt-get update \
&& apt-get install -qqy --no-install-recommends \
curl \
&& rm -rf /var/lib/apt/lists/*```
COPY ${JAR_FILE} app.jar
ENV JAVA_OPTS="-Djdk.tls.client.protocols=tls"
# By providing an entrypoint above, your CMD can optionally define any default
# arguments you might want to fallback to.
CMD ["java", "-jar", "$JAVA_OPTS", "-jar", "app.jar"]
如果保持不变,我做的另一个更改是将JAVA\u OPTS
移动到ARG
。这里简单的经验法则是:ARG
用于构建,ENV
用于运行时
警告:上述过度简化过于简单
但是,这会将构建命令(如果需要将JAR\u文件
改写为:
docker build -t jarjar/binks --build-arg JAR_FILE=another/file.jar .
您可以非常类似地运行它:
JAVA_OPTS="-Djdk.tls.client.protocols='TLSv1,TLSv1.1' -Xms#G -Xmx#G" &&
docker run jarjar/binksjarjar/binks --args=here
我鼓励您进一步阅读CMD
和` ENTRYPOINT,以了解一起/单独使用它们的优点/缺点
接受他的回答,如果您遇到任何其他问题,请告诉我们:)
apt get
在gcr.io/distroless/java:8
中不存在。事实上,唯一有用的可执行文件是java
和openssl
——它甚至不包含ls
、cat
,甚至不包含sh
。无论是直接<代码>复制< /COD>您需要的可执行文件,或考虑使用另一个基础图像。谢谢您@库尔凯瓦尼,我将如何复制可执行文件。我能在这张图中简单地得到壳的形式吗?Bcoz如果这成为可能,那么我就不必将RUN和ENTRYPOINT从shell表单更改为exec表单。可能是通过使用多阶段构建?谢谢@syntaqx如果我问了一些非常基本的问题,请原谅,但我对docker world和命令行也是新手。我所做的是删除了所有其他内容并保持在dockerfile下面:从gcr.io/distroless/java:8 ARG JAR_FILE COPY target/${JAR_FILE}/xyz/yy.JAR ENTRYPOINT[“java”、“$java_OPTS”、“-Djdk.tls.client.protocols=tls”、“-JAR”、“/opt/witness.JAR”]。然后只做了“docker运行DockerReportName”。我得到一个错误,说找不到或加载邮件类$JAVA_OPTS。另外,我不明白为什么要在$JAVA_OPTS前面给-jar。