为了账号安全,请及时绑定邮箱和手机立即绑定

如何在已经使用另一个映像的 docker 容器中设置和运行一个非常简单的

如何在已经使用另一个映像的 docker 容器中设置和运行一个非常简单的

波斯汪 2022-09-28 16:40:59
我的任务是创建一个非常简单的,Web浏览器可访问的gui,可以在docker容器中运行特定的java文件。为此,我选择设置一个php-apache服务器,该服务器提供索引.php带有gui的文档。泊坞文件如下所示:FROM php:7.0-apacheCOPY src /var/www/htmlEXPOSE 80这得到了gui(索引.php在src文件夹中)我已经写好了,运行没有问题,但它无法访问和运行所需的java文件(显然,因为这会创建一个单独的容器)。问题:如何在现有的 Docker 文件(下面提供)中设置一个 php-apache 服务器,执行与上述 Docker 文件相同的操作?我的目标是使用php脚本运行java文件并向用户显示结果。FROM openjdk:8-jre-slimWORKDIR /usr/src/appCOPY ["./build/libs/*.jar", "./fooBar.jar"]ENV JAVA_OPTS=${FOO_JAVA_OPTS}CMD ["/usr/bin/tail", "-f", "/dev/null"]我没有自己编写java文件,只是负责使用它来运行特定的命令。
查看完整描述

2 回答

?
烙印99

TA贡献1829条经验 获得超13个赞

似乎没有像我最初希望的那样合并图像的简单方法(您的 Dockerfile 中不能有多个 FROM 语句)。我最终要做的是手动将两个图像(openjdkphp)合并成这样的东西:

FROM php:7.0-apache


ENV LANG C.UTF-8

RUN { \

        echo '#!/bin/sh'; \

        echo 'set -e'; \

        echo; \

        echo 'dirname "$(dirname "$(readlink -f "$(which javac || which java)")")"'; \

    } > /usr/local/bin/docker-java-home \

    && chmod +x /usr/local/bin/docker-java-home

RUN ln -svT "/usr/lib/jvm/java-8-openjdk-$(dpkg --print-architecture)" /docker-java-home

ENV JAVA_HOME /docker-java-home/jre

ENV JAVA_VERSION 8u212

ENV JAVA_DEBIAN_VERSION 8u212-b01-1~deb9u1

RUN set -ex; \

    if [ ! -d /usr/share/man/man1 ]; then \

        mkdir -p /usr/share/man/man1; \

    fi; \

    apt-get update; \

    apt-get install -y --no-install-recommends openjdk-8-jre-headless="$JAVA_DEBIAN_VERSION"; \

    rm -rf /var/lib/apt/lists/*; \

    [ "$(readlink -f "$JAVA_HOME")" = "$(docker-java-home)" ]; \

    update-alternatives --get-selections | awk -v home="$(readlink -f "$JAVA_HOME")" 'index($3, home) == 1 { $2 = "manual"; print | "update-alternatives --set-selections" }'; \

    update-alternatives --query java | grep -q 'Status: manual'


COPY ["./build/libs/*.jar", "./FooBar.jar"]

ENV JAVA_OPTS=${FOO_JAVA_OPTS}


COPY gui/src /var/www/html

EXPOSE 80

两者都是基于 Debian 的图像,所以合并相对容易(我还从原始图像源中删除了许多杂乱的评论),并且由于 openjdk 图像更简单,我将其添加到 php 图像的顶部,而不是相反。


查看完整回答
反对 回复 2022-09-28
?
智慧大石

TA贡献1946条经验 获得超3个赞

因为它是基于 Debian 的图像。一种方法是,在容器中安装软件包并从中创建新映像。


root@310c94d8d75f:/usr/src/app# cat /etc/os-release

PRETTY_NAME="Debian GNU/Linux 9 (stretch)"

NAME="Debian GNU/Linux"

VERSION_ID="9"

VERSION="9 (stretch)"


2: root@310c94d8d75f:/usr/src/app# apt update


3- root@310c94d8d75f:/usr/src/app# apt install apache2

4- root@310c94d8d75f:/usr/src/app# apt install php

最后运行:泊坞窗提交


在此之后,您将获得具有上述名称的新图像。


楼盘: https://docs.docker.com/engine/reference/commandline/commit/


2:您可以在 Dockerfile 中添加相同的命令并重建。


FROM openjdk:8-jre-slim


WORKDIR /usr/src/app

COPY ["./build/libs/*.jar", "./fooBar.jar"]

ENV JAVA_OPTS=${FOO_JAVA_OPTS}

CMD ["/usr/bin/tail", "-f", "/dev/null"]

RUN apt update && apt install apache2 -y && apt install php -y


查看完整回答
反对 回复 2022-09-28
  • 2 回答
  • 0 关注
  • 93 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信