使用此命令启动并运行我的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 上述文件中的更改:
- 使用
COPY
而不是ADD
- 将
J_FILE
的默认值设置为./target/myapp-SNAPSHOT.jar
以防--build-arg
未使用docker build
命令传递。