Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法生成Docker映像_Docker_Dockerfile - Fatal编程技术网

无法生成Docker映像

无法生成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

无法生成下面的映像,因为此映像不支持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_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,以了解一起/单独使用它们的优点/缺点

编辑:跟进 不幸的是,在发布我的答案之前,我实际上无法运行任何这些,并且回顾了,这是你将在我的反馈中遇到的100%以上的问题


接受他的回答,如果您遇到任何其他问题,请告诉我们:)

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。