制作镜像示例

更新时间: 2025-05-15 16:36:06

制作SAE应用镜像的方式与您日常制作镜像的方式没有任何差异。如果您不熟悉如何制作镜像,可以参考本文提供的示例。

  1. 确保环境中已安装并运行Docker,您可以通过执行docker --version来验证。

  2. 进入项目所在路径,创建名为Dockerfile的文件。不同语言的Dockerfile示例如下。

    Java

    假设目录结构如下:

    .
    ├── Dockerfile # 新建的Dockerfile文件
    ├── target
    │   ├── my-app.jar # 打包项目时生成的JAR包
    ├── src # 构建镜像仅与Dockerfile和jar包有关,与源码和其他配置文件无关。
    │   ├── ...
    ├── pom.xml

    则Dockerfile内容如下:

    # 指定基础镜像,以openjdk 8为例
    FROM openjdk:8-jdk-alpine
    
    # 将本地的jar包拷贝到镜像中
    COPY ./target/my-app.jar /
    
    # 设置启动命令
    ENTRYPOINT ["java", "-jar", "/my-app.jar"]

    PHP

    假设目录结构如下:

    .
    ├── Dockerfile # 新建的Dockerfile文件
    ├── entrypoint.sh # 新建的容器启动脚本
    ├── php
    │   ├── index.php
    │   └── phpinfo.php
    ├── nginx
    │   ├── nginx.conf
    │   ├── conf.d
    │   |   ├── default.conf
    │   ├── fastcgi_params
    │   ├── ...

    则Dockerfile内容如下:

    # 指定基础镜像,以PHP-FPM镜像为例
    FROM php:8.2-fpm-alpine
    
    # 安装Nginx
    RUN apk add --no-cache nginx
    
    # 将 Nginx 配置文件复制到容器
    COPY nginx/ /etc/nginx/
    
    # 将 PHP 文件复制到工作目录
    COPY php/ /var/www/html/
    
    # 将本地启动脚本复制到镜像,容器启动时执行启动脚本
    COPY entrypoint.sh /entrypoint.sh
    RUN chmod +x /entrypoint.sh
    ENTRYPOINT ["/entrypoint.sh"]
    

    启动脚本entrypoint.sh内容如下:

    #!/bin/sh
    
    # 启动 PHP-FPM 后台运行
    php-fpm -D
    
    # 检查 PHP-FPM 是否启动成功
    if ! pgrep "php-fpm" >/dev/null
    then
        echo "PHP-FPM failed to start!"
        exit 1
    fi
    
    # 前台运行 Nginx
    nginx -g "daemon off;"

    Python

    假设目录结构如下:

    .
    ├── Dockerfile # 新建的Dockerfile文件
    ├── entrypoint.sh # 新建的容器启动脚本
    ├── my_app
    │   ├── requirements.txt
    │   ├── main.py
    │   ├── my_package
    │   |   ├── __init__.py
    │   |   ├── ...

    则Dockerfile内容如下:

    # 指定基础镜像,以Python 3.9镜像为例
    FROM python:3.9
    
    # 将本地python代码复制到镜像
    RUN mkdir -p /my_app
    COPY my_app/ /my_app/
    
    # 根据requirements.txt在镜像中安装依赖。
    RUN pip install -r /my_app/requirements.txt
    
    # 将本地启动脚本复制到镜像,容器启动时执行启动脚本
    COPY entrypoint.sh /entrypoint.sh
    RUN chmod +x /entrypoint.sh
    ENTRYPOINT ["/entrypoint.sh"]
    

    启动脚本entrypoint.sh内容如下:

    #!/bin/sh
    
    # 本示例通过Gunicorn启动my_app/main.py中的app,app是一个Flask实例。其中,Flask、Gunicorn通过requirements.txt指定。
    gunicorn -w 3 -b 0.0.0.0:8080 my_app.main:app

    Node.js

    以通过Nginx部署前端项目为例,假设目录结构如下:

    .
    |- Dockerfile # 新建的Dockerfile文件
    |- nginx-conf # 存放Nginx配置文件
    |  |- nginx.conf
    |  |- conf.d
    |  |  |- default.conf
    |  |- ...
    |- package.json
    |- src
    |  |- ...
    |- dist # 存放项目构建后生成的静态资源文件
    |  |- index.html
    |  |- static
    |  |  |- ...

    则Dockerfile内容如下:

    # 指定基础镜像
    FROM nginx:1.22
    
    # 复制本地的静态资源文件到容器环境的指定路径
    COPY ./dist /usr/share/nginx/html/
    
    # 复制本地的Nginx配置文件到容器环境的指定路径
    COPY ./nginx-conf /etc/nginx/
    
    # 沿用基础镜像中的启动命令,无需额外设置
  3. 构建镜像:docker build -t <镜像名称>:<镜像tag> .(例如docker build -t my-app:1.0 .

  4. 将镜像推送到镜像仓库。如果现有的镜像仓库不满足需求,推荐使用阿里云容器镜像服务ACR个人版ACR企业版

  5. 根据镜像仓库类型,选择使用同账号ACR实例的镜像部署应用使用不同账号ACR实例的镜像部署应用使用非ACR实例的镜像部署应用

上一篇: 使用镜像部署应用 下一篇: 使用同账号ACR实例的镜像部署应用
阿里云首页 Serverless 应用引擎 相关技术圈