我的任务是创建一个非常简单的Web浏览器可访问的gui,它可以在docker容器中运行特定的java文件。为此,我选择设置一个php-apache服务器,该服务器使用gui提供index.php文件。 Dockerfile看起来像这样:
FROM php:7.0-apache
COPY src /var/www/html
EXPOSE 80
这得到了gui(index.php在src文件夹中)我已经编写并运行没有问题,但它无法访问和运行所需的java文件(显然,因为这会创建一个单独的容器)。
问题:
如何在现有Dockerfile(下面提供)中设置一个php-apache服务器,与上面的Dockerfile做同样的事情?我的目标是使用php脚本运行java文件并将结果显示给用户。
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"]
我自己没有编写java文件,只负责运行使用它的特定命令。
因为它是基于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
最后运行:docker commit
在此之后,您将获得具有上述名称的新图像。
参考: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
似乎没有像我最初希望的那样合并图像的简单方法(你的Dockerfile中不能有多个FROM语句)。我最终做的是手动将两个图像(openjdk和php)合并成这样的东西:
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图像之上而不是相反。