本教程使用我们的 core:java
docker 镜像中的示例,该镜像可在 GitHub 上找到。本教程还假定您具备一些 Docker 知识,如果这一切对您来说并不陌生,我们建议您阅读一下。
创建 Dockerfile
此过程最重要的部分是创建守护程序将使用的 Dockerfile
。由于对服务器容器的严格限制,您必须以特定方式设置此文件。
我们尝试尽可能多地使用 Alpine Linux 来制作我们的镜像,以减小它们的大小。
# ----------------------------------
# Pterodactyl Core Dockerfile
# Environment: Java
# Minimum Panel Version: 0.6.0
# ----------------------------------
FROM openjdk:8-jdk-alpine
MAINTAINER Pterodactyl Software, <support@pterodactyl.io>
RUN apk add --no-cache --update curl ca-certificates openssl git tar bash sqlite fontconfig \
&& adduser --disabled-password --home /home/container container
USER container
ENV USER=container HOME=/home/container
WORKDIR /home/container
COPY ./entrypoint.sh /entrypoint.sh
CMD ["/bin/bash", "/entrypoint.sh"]
让我们来看看上面的内容。您将注意到的第一件事是 FROM
声明。Dockerfile
FROM openjdk:8-jdk-alpine
在本例中,我们使用的是 openjdk:8-jdk-alpine
,它为我们提供了 Java 8。
安装依赖项
接下来我们要做的是使用 Alpine 的包管理器安装我们需要的依赖项:.您会注意到一些使容器保持较小的特定标志,包括 ,以及单个 RUN
块中包含的所有内容。apk--no-cache
创建容器用户
在此块中,您会注意到该命令。RUNuseradd
adduser -D -h /home/container container
注意
所有翼龙容器都必须具有名为 的用户,并且用户 home 必须是 。container/home/container
创建该用户后,我们定义默认容器 USER
以及要应用于容器内运行的事物的一些 ENV
设置。
工作目录和入口点
我们要做的最后一件事是定义一个 WORKDIR
,这是执行其他所有内容的位置。必须将 .WORKDIR/home/container
最后,我们需要将 ENTRYPOINT
脚本复制到 docker 镜像根目录中。这是使用 COPY
完成的,之后我们定义使用 CMD
启动容器时要使用的命令。该行应始终指向文件。CMDentrypoint.sh
COPY ./entrypoint.sh /entrypoint.sh
CMD ["/bin/bash", "/entrypoint.sh"]
入口点脚本
为了完成此作 ,我们需要一个文件,告诉 Docker 如何运行此特定服务器类型。Dockerfileentrypoint.sh
这些入口点文件实际上是相当抽象的,守护进程会在处理启动命令并执行命令之前将启动命令作为环境变量传入。
#!/bin/bash
cd /home/container
# Output Current Java Version
java -version ## only really needed to show what version is being used. Should be changed for different applications
# Replace Startup Variables
MODIFIED_STARTUP=`eval echo $(echo ${STARTUP} | sed -e 's/{{/${/g' -e 's/}}/}/g')`
echo ":/home/container$ ${MODIFIED_STARTUP}"
# Run the Server
${MODIFIED_STARTUP}
第二个命令 , 只是确保我们在运行其余命令时位于正确的目录中。然后,我们跟进该作,将此信息输出给最终用户,但这不是必需的。cd /home/containerjava -version
修改 Startup 命令
此文件最重要的部分是环境变量。在这种情况下,我们所做的是解析 Daemon 传递给容器的环境。在大多数情况下,此变量类似于以下示例:MODIFIED_STARTUPSTARTUP
STARTUP="java -Xms128M -Xmx{{SERVER_MEMORY}}M -jar {{SERVER_JARFILE}}"
您会注意到那里的一些占位符,特别是 和 .这些都引用了传入的其他环境变量,它们看起来类似于下面的示例。{{SERVER_MEMORY}}{{SERVER_JARFILE}}
SERVER_MEMORY=1024
SERVER_JARFILE=server.jar
有许多不同的环境变量,它们会根据特定的服务选项配置而变化。但是,这不一定是这里需要担心的。
MODIFIED_STARTUP=`eval echo $(echo ${STARTUP} | sed -e 's/{{/${/g' -e 's/}}/}/g')`
上面的命令只是计算环境变量,然后将大括号括起来的任何内容替换为匹配的环境变量(例如 )。因此,我们的命令:STARTUP{{EXAMPLE}}EXAMPLESTARTUP
java -Xms128M -Xmx{{SERVER_MEMORY}}M -jar {{SERVER_JARFILE}}
成为:
java -Xms128M -Xmx1024M -jar server.jar
运行命令
最后一步是运行这个修改后的启动命令,该命令通过行
${MODIFIED_STARTUP}
注意
有时您可能需要更改文件的权限,在 linux 上,您可以通过在文件所在的目录中执行来执行此作。
entrypoint.sh
chmod +x entrypoint.sh