未从命令行正确读取 Docker 参数



使用此命令启动并运行我的docker容器,传入参数./target/myapp-SNAPSHOT.jar其中./target/myapp-SNAPSHOT.jar是我希望运行的Spring启动应用程序:

docker build -t foo . && docker run -it foo -e J_FILE=./target/myapp-SNAPSHOT.jar

我收到错误:

standard_init_linux.go:211: exec user process caused "exec format error"

Dockerfile:

FROM adoptopenjdk/openjdk8:alpine-jre
LABEL app.name="test"
LABEL app.type="test"
ARG J_FILE
ADD ${J_FILE} /myapp.jar
COPY J_FILE /myapp.jar
COPY startup.sh /
RUN chmod +x startup.sh;
ENTRYPOINT ["/startup.sh"]
EXPOSE 8080

startup.sh :

#!/bin/sh
JAVA_HEAP_INITIAL=384m
JAVA_HEAP_MAX=768m
JAVA_METASPACE_MAX=128m
java -jar /app.jar

如果我更改Dockerfile以显式复制jar文件:

FROM adoptopenjdk/openjdk8:alpine-jre
LABEL app.name="test"
LABEL app.type="test"
COPY ./target/myapp-SNAPSHOT.jar /myapp.jar
COPY startup.sh /
RUN chmod +x startup.sh;
ENTRYPOINT ["/startup.sh"]
EXPOSE 8080

应用按预期启动。

Dockerfile中的ARG标志用于在构建 docker 映像时进行配置。运行容器时,它不会产生任何影响。

因此,您应该将命令更新为如下所示:

docker build --build-arg J_FILE=./target/myapp-SNAPSHOT.jar -t foo . && docker run -it foo

您还可以将Dockerfile更新为如下所示:

FROM adoptopenjdk/openjdk8:alpine-jre
LABEL app.name="test"
LABEL app.type="test"
ARG J_FILE=./target/myapp-SNAPSHOT.jar
COPY ${J_FILE} /myapp.jar
COPY startup.sh /
RUN chmod +x startup.sh;
ENTRYPOINT ["/startup.sh"]
EXPOSE 8080

注2 上述文件中的更改:

  1. 使用COPY而不是ADD
  2. J_FILE的默认值设置为./target/myapp-SNAPSHOT.jar以防--build-arg未使用docker build命令传递。

最新更新