我有一个运行springboot java应用程序的docker容器。 Dockerfile:
# Create container with java preinstalled
FROM openjdk:8-jdk-alpine
# Create app directory
VOLUME /tmp
# Handle Arguments
ARG JAR_FILE
ARG ENV_NAME
ENV SPRING_PROFILES_ACTIVE=${ENV_NAME}
RUN echo ${ENV_NAME}
# Bundle app source
COPY ${JAR_FILE} app.jar
COPY application.yml application.yml
# Run the server
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Dspring.config.location=application.yml","-jar","app.jar"]
现在,我有一个需要安装在该容器中的自定义库。我需要复制安装,解压缩,运行安装脚本并回答提示(是/否)
我知道最简单的方法是连接到容器,安装软件包并提交更改。
首先-我使用以下方法启动容器:
docker run --name local-jdk8 -d openjdk:8-jdk-alpine
下一步是复制数据并运行安装脚本,但是容器会继续退出,因为运行命令为空(“ / bin / sh”),这意味着我无法运行
docker exec -it local-jdk8 bash
关于如何修改此类容器的任何想法?
答案 0 :(得分:0)
使用Expect库解决了该问题
我的dockerfile:
# Create container with java preinstalled
FROM openjdk:8
# Create app directory
VOLUME /tmp
# Handle Arguments
ARG JAR_FILE
ARG ENV_NAME
ARG DRIVER_FILE
# Environment
ENV SPRING_PROFILES_ACTIVE=${ENV_NAME}
RUN echo ${ENV_NAME}
# Fingerprint Driver
RUN apt-get update -y
RUN apt-get install -y expect
COPY ${DRIVER_FILE} driver.tar.gz
COPY driver-install.exp driver-install.exp
RUN tar -xzf driver.tar.gz
RUN /driver-install.exp
# Copy app source
COPY ${JAR_FILE} app.jar
COPY application.yml application.yml
# Run the server
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Dspring.config.location=application.yml","-jar","app.jar"]
driver-install.exp是与脚本安装自动交互的期望脚本
答案 1 :(得分:0)
对于它的价值,这里有一个小技巧,可让您保持容器运行以进行修改和提交:
docker run --name local-jdk8 -d openjdk:8-jdk-alpine tail -f /dev/null
此外,容器上没有安装bash
,因此sh
必须这样做:
docker exec -it local-jdk8 sh
尽管如此,修改Dockerfile
是更好的方法,因为您的更改将保留在代码中,而不是在可能短暂的容器中完成。