无法构建 Docker 映像

时间:2021-05-21 07:27:40

标签: docker dockerfile

下图无法构建,因为该图不支持shell形式,只支持exec形式,因此RUN和ENTRYPOINT只支持vector形式。请建议如何构建准确的图像,因为使用此图像很重要。

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 $@

此外,当我尝试以向量形式指定 RUN 时,我得到“exec: 在 $PATH 中找不到“apt-get”可执行文件。

1 个答案:

答案 0 :(得分:1)

这里的 exec ... $@ 用法似乎有点奇怪...

ENTRYPOINT 正在将您的容器配置为作为可执行文件运行,从而允许您的 CMD 为您的可执行文件提供默认参数,因此 100% 不需要使用 $0 $@

虽然我没有任何 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" ]

然而,preferred usage 是将您的 CMD 用作 exec,而根本不将 ENTRYPOINT 包含在此类使用中。然后,您的整个 CMD 是可自定义的,您可以消除对 $JAVA_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_OPTS 移至 ARG。这里的简单经验法则是:ARG 用于构建,ENV 用于运行时。

<块引用>

警告:上述过度简化过于简单。

但是,这会改变您的构建命令(如果您需要将 JAR_FILE 覆盖为此:

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,以了解将它们一起/单独使用的利弊。

编辑:跟进

不幸的是,在发布我的答案和查看 comment from koorkevani 之前,我实际上无法运行其中任何一个,这使您在我的反馈中遇到的问题增加了 100%。

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