
# 使用Java构建容器镜像开发事件函数
使用容器镜像创建并执行事件函数的完整操作步骤可参考[使用容器镜像创建并执行事件函数](https://support.huaweicloud.com/qs-functiongraph/functiongraph_04_0104.html)，本章节介绍如何使用Java语言制作镜像，并进行本地验证。
#### 步骤一：制作镜像
以在linux x86 64位系统上制作镜像为例（系统配置无要求）。
1. 执行以下命令，创建一个空文件夹。
   ```
   mkdir custom_container_event_example && cd custom_container_event_example
   ```
   
2. 使用IntelliJ IDEA创建一个SpringBoot项目，并如[图2]所示勾选Spring Web。
   图1创建SpringBoot项目   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000002419783910.png "点击放大")
   图2勾选Spring Web   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000002419624062.png "点击放大") 
3. 使用java语言实现一个HTTP Server的demo，处理函数http请求并响应。 demo中另外创建了一个controller包，并为此包创建HelloWorld类，代码如下：
   ```
   import org.apache.logging.log4j.LogManager;
   import org.apache.logging.log4j.Logger;
   import org.springframework.web.bind.annotation.RequestMapping;
   import org.springframework.web.bind.annotation.RestController;
   @RestController
   public class HelloWorld {
       // 创建一个日志记录器，用于记录调试信息
       private static final Logger logger = LogManager.getLogger(HelloWorld.class);
       // 处理 /init 请求
       @RequestMapping("/init")
       public String init() {
           logger.debug("access init");
           return "hello init!!";
       }
       // 处理 /invoke 请求
       @RequestMapping("/invoke")
       public String invoke() {
           logger.debug("access invoke");
           return "hello invoke!!";
       }
   }
   ```
   
4. 创建Dockerfile文件，将"demoSpringBoot-0.0.1-SNAPSHOT.jar"替换为编译好的jar包。
   ```
   FROM ubuntu:22.04
   ENV HOME=/home/paas
   ENV GROUP_ID=1003
   ENV GROUP_NAME=paas_user
   ENV USER_ID=1003
   ENV USER_NAME=paas_user
   RUN mkdir -m 550 ${HOME} && groupadd -g ${GROUP_ID} ${GROUP_NAME} && useradd -u ${USER_ID} -g ${GROUP_ID} ${USER_NAME}
   RUN apt-get update &&  \
       apt-get install -y --no-install-recommends openjdk-21-jre-headless maven &&  \
       apt-get clean
   COPY demoSpringBoot-0.0.1-SNAPSHOT.jar ${HOME}/
   RUN chown -R ${USER_ID}:${GROUP_ID} ${HOME}
   RUN chmod -R 775 ${HOME}
   USER ${USER_NAME}
   WORKDIR ${HOME}
   EXPOSE 8000
   ENTRYPOINT ["java", "-jar", "-Dfile.encoding=utf-8" ,"/home/paas/demoSpringBoot-0.0.1-SNAPSHOT.jar"]
   ```
   表1参数说明 
   | 参数         | 说明                                                                                                                                                   |
   |:---|:---|
   | FROM       | 指定基础镜像为ubuntu:22.04，基础镜像必须设置，值可修改。                                                                                                                   |
   | ENV        | 设置环境变量，设置HOME环境变量为/home/custom_container、GROUP_NAME和USER_NAME为custom_container、**USER_ID和GROUP_ID为1003**，这些环境变量必须设置，值可修改。                            |
   | RUN        | 执行命令，格式为RUN \<命令\>。例如RUN mkdir -m 550 ${HOME}表示构建容器时创建${USER_NAME}用户的${HOME}目录。                                                                      |
   | COPY       | 从构建上下文复制文件或目录到镜像中。将"demoSpringBoot-0.0.1-SNAPSHOT.jar"文件拷贝到容器的${USER_NAME}用户的${HOME}目录下。                                                             |
   | USER       | 切换${USER_NAME}用户。                                                                                                                                    |
   | WORKDIR    | 切换工作目录到${USER_NAME}用户的${HOME}目录下。                                                                                                                    |
   | EXPOSE     | 暴露容器的8000端口，请勿修改。                                                                                                                                    |
   | ENTRYPOINT | 设置容器启动时运行的命令，使用以下命令启动容器。 ``` java -jar -Dfile.encoding=utf-8 /home/paas/demoSpringBoot-0.0.1-SNAPSHOT.jar ``` |
      
   
5. 执行以下命令构建镜像。
   ```
   docker build -t custom_container_event_example:latest .
   ```
   指定镜像的名称为"custom_container_event_example"，版本为latest，"."指定Dockerfile所在目录，镜像构建命令将该路径下所有的内容打包给容器引擎帮助构建镜像。
   
#### 步骤二：本地验证
1. 执行以下命令启动docker容器。
   ```
   docker run -u 1003:1003 -p 8000:8000 custom_container_event_example:latest
   ```
   
2. 打开一个新的命令行窗口，向开放的8000端口发送消息，访问模板代码中指定的/\*\*\*路径。
   ```
   curl -XPOST -H 'Content-Type: application/json' localhost:8000/***
   ```
   将按照模块代码返回以下内容：
   ```
   hello invoke!!
   ```
   
 
#### 步骤三：配置函数
在本地完成容器镜像构建后，即可登录华为云控制台进行控制台操作。
后续操作步骤请参考[使用容器镜像创建并执行事件函数](https://support.huaweicloud.com/qs-functiongraph/functiongraph_04_0104.html#section4)，从步骤三：上传镜像开始操作。
#### 相关文档
- 关于函数开发的更多说明，如函数支持的运行时、函数支持的触发事件、函数工程打包规范以及如何在函数中引入动态链接库，请参见[函数开发概述](https://support.huaweicloud.com/devg-functiongraph/functiongraph_02_0100.html)。
- 关于Java函数开发的接口定义和SDK接口说明，请参见[Java函数开发概述](https://support.huaweicloud.com/devg-functiongraph/functiongraph_02_0430.html)。
 
