繁体   English   中英

将 Shell 脚本转换为 Dockerfile

[英]Converting Shell Script to Dockerfile

我有 Java 应用程序并想生成 docker 图像,我有 shell 脚本,如下所示:

#!/bin/sh

java -version

export APPLICATION_DIR=$PWD

for rJarFile in `ls ${APPLICATION_DIR}/lib/*.jar`
do
        export CLASSPATH=$rJarFile:$CLASSPATH
done

export CLASSPATH=$APPLICATION_DIR/classes:$CLASSPATH

java -Xverify:none -Xmx2048m -Djava.awt.headless=true -DFI_IS_CONFIGSER=N -DFICLIENT_APP_PATH=${APPLICATION_DIR} -DFI_APP_NAME=FIONLINE -DFI_BASE_INSTANCE_ID=1 -DPRODUCT_BOOTSTRAP_FILE=${APPLICATION_DIR}/data/BootstrapFile.properties -DFEBA_SYS_PATH=${APPLICATION_DIR}/data 

我尝试像这样将其转换为 Dockerfile

# FROM openjdk:8
FROM openjdk:11

RUN javac -version

# Create app directory
WORKDIR /usr/src/app

# Bundle app source
COPY . .

ENV APPLICATION_DIR=/usr/src/app

RUN echo $APPLICATION_DIR

RUN for rJarFile in `ls ${APPLICATION_DIR}/lib/*.jar`; do export CLASSPATH=$rJarFile:$CLASSPATH; done

RUN echo $CLASSPATH

ENV $CLASSPATH=$APPLICATION_DIR/classes:$CLASSPATH

# Run app
ENTRYPOINT ["java", "-Xverify:none", "-Xmx2048m", "-Djava.awt.headless=true", "-DFI_IS_CONFIGSER=N", "-DFICLIENT_APP_PATH=${APPLICATION_DIR} -DFI_APP_NAME=FIONLINE -DFI_BASE_INSTANCE_ID=1", "-DPRODUCT_BOOTSTRAP_FILE=${APPLICATION_DIR}/data/BootstrapFile.properties", "-DFEBA_SYS_PATH=${APPLICATION_DIR}/data"]

它可以生成,但是当我尝试像这样运行它时出现错误:

Error response from daemon: OCI runtime create failed: container_linux.go:370: starting container process caused: process_linux.go:459: container init caused: setenv: invalid argument: unknown

我还RUN for rJarFile in `ls ${APPLICATION_DIR}/lib/*.jar`; do export RUN for rJarFile in ls ${APPLICATION_DIR}/lib/*.jar; do export CLASSPATH=$rJarFile:$CLASSPATH; done RUN for rJarFile in `ls ${APPLICATION_DIR}/lib/*.jar`; do export到此 RUN; RUN for rJarFile in ls ${APPLICATION_DIR}/lib/*.jar; do export CLASSPATH=$rJarFile:$CLASSPATH; done RUN for rJarFile in ls ${APPLICATION_DIR}/lib/*.jar; do export CLASSPATH=$rJarFile:$CLASSPATH; done ,但他们都没有工作。 我不想让 Dockerfile 执行脚本。 以下是我生成并运行它时的日志。

生成

您不能像这样更新类路径:

ENV $CLASSPATH=$APPLICATION_DIR/classes:$CLASSPATH

相反,你可以做

ENV CLASSPATH=$APPLICATION_DIR/classes:$CLASSPATH

另外 - 请考虑将脚本移动到单独的 shell 脚本中并添加到容器中。 这将大大简化 Dockerfile,例如:

# FROM openjdk:8
FROM openjdk:11

RUN javac -version

# Create app directory
WORKDIR /usr/src/app

# Bundle app source
COPY . .

ENV APPLICATION_DIR=/usr/src/app

RUN echo $APPLICATION_DIR

ENTRYPOINT ["/usr/src/app/start_java.sh"]

并将现有脚本保存在start_java.sh

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM