在不断退出的Docker容器中安装自定义软件包

时间:2018-09-17 17:09:02

标签: java docker

我有一个运行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

关于如何修改此类容器的任何想法?

2 个答案:

答案 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是更好的方法,因为您的更改将保留在代码中,而不是在可能短暂的容器中完成。