前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Dockerfile 实践:构建 Java、Python、Vue 和 Go 环境

Dockerfile 实践:构建 Java、Python、Vue 和 Go 环境

原创
作者头像
蚂蚁蚂蚁
修改2024-03-29 19:27:05
840
修改2024-03-29 19:27:05
举报
文章被收录于专栏:技术分享技术分享

在这篇文章中,我将分享如何使用 Dockerfile 为不同的编程语言和框架创建 Docker 镜像。我们将覆盖 Java、Python、Vue3 和 Go。

Python

对于 Python,我们从一个基于 Python 3.10.12 的 Docker 镜像开始。我们设置环境变量 TZLANG,然后将工作目录切换到 /app/YOUR_PROJECT

接下来,我们复制 requirements.txt 文件,并使用 pip3 命令安装依赖项。然后,我们复制源代码和 .env 文件。

最后,我们暴露端口 8080,并设置 ENTRYPOINT 以启动我们的 Python 应用程序。

代码语言:dockerfile
复制
FROM python:3.10.12-slim
ENV TZ=Asia/Shanghai
ENV LANG zh_CN.UTF-8

WORKDIR /app/YOUR_PROJECT
COPY ./requirements.txt /app/YOUR_PROJECT/
RUN pip3 install -i https://pypi.mirrors.ustc.edu.cn/simple --upgrade pip && \
    pip3 install -i https://pypi.mirrors.ustc.edu.cn/simple --no-cache-dir -r requirements.txt

COPY ./src .
COPY .env ./

EXPOSE 8080
ENTRYPOINT ["python3", "main.py"]

Go

对于 Go,我们首先在本地初始化项目:

代码语言:sh
复制
go mod init YOUR_PROJECT
go mod tidy

然后,我们创建一个 Dockerfile。我们从一个基于 Go 1.20.2 的 Docker 镜像开始,设置时区,并将工作目录切换到 /app

接下来,我们复制 Go 源代码,并运行 go mod initgo mod tidy 命令来初始化 Go 模块。然后,我们使用 go build 命令构建我们的应用程序。

最后,我们复制 .env 文件,暴露端口 8080,并设置 CMD 以启动我们的 Go 应用程序。

代码语言:dockerfile
复制
FROM golang:1.20.2
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

WORKDIR /app

# V1: go mod init in builder
COPY *.go ./
RUN go mod init godemo && go mod tidy
RUN CGO_ENABLED=0 GOOS=linux go build -o /godemo

# V2: go mod tidy locally and download Go modules in builder
#COPY go.mod go.sum ./
#RUN go mod download
#COPY *.go ./
#RUN CGO_ENABLED=0 GOOS=linux go build -o /godemo

# V3: copy excutable to container
#COPY build/godemo /

COPY .env ./

EXPOSE 8080
CMD ["/godemo"]

可以参考:Docker.Docs - Build your Go image(

Java

首先,我们从一个基于 Maven 和 OpenJDK 8 的 Docker 镜像开始构建我们的 Java 应用程序。然后,我们将 pom.xml 和源代码复制到临时目录,并运行 mvn package 命令来构建我们的应用程序。

在第二阶段,我们从一个基于 Alpine Linux 和 OpenJDK 8 的 Docker 镜像开始,更新系统,添加 libc6-compat 包,并创建一个符号链接。然后,我们将工作目录切换到 /app/,并从构建阶段复制我们的应用程序和资源文件。

最后,我们设置 ENTRYPOINT 以启动我们的 Java 应用程序。

代码语言:dockerfile
复制
FROM maven:3-openjdk-8-slim AS BUILD
COPY pom.xml /tmp/
COPY src /tmp/src/
WORKDIR /tmp/
RUN mvn package

FROM openjdk:8-alpine AS RUNTIME
RUN apk update && apk add --no-cache libc6-compat
RUN ln -s /lib64/ld-linux-x86-64.so.2 /lib/ld-linux-x86-64.so.2
WORKDIR /app/
COPY --from=BUILD /tmp/target/javademo-0.1-jar-with-dependencies.jar .
COPY src/main/resources ./resources
ENTRYPOINT ["java", "-cp", "*", "demo.JavaDemo"]

Vue

对于 Vue3 项目,可以使用 Vite 构建和打包,并通过 Nginx 对外提供服务

首先添加一个 Nginx 的配置文件

代码语言:conf
复制
worker_processes 4;
events { worker_connections 1024; }

http {
    server {
        listen 8080;
        root  /usr/share/nginx/html/app;
        include /etc/nginx/mime.types;

        location /app/ {
            root  /usr/share/nginx/html;
            try_files $uri $uri/ /app/index.html;
        }
    }
}

然后,我们创建一个 Dockerfile。在构建阶段,我们从一个基于 Node.js 18 的 Docker 镜像开始,复制 package.json 文件,并安装依赖项。然后,我们复制源代码,并运行 npm run build 命令来构建我们的应用程序。

在生产阶段,我们从一个基于 Alpine Linux 和 Nginx 的 Docker 镜像开始,设置环境变量 TZ,并复制 Nginx 配置文件。然后,我们清空 Nginx 的默认 HTML 目录,并从构建阶段复制我们的应用程序。

最后,我们暴露端口 8080,并设置 ENTRYPOINT 以在前台运行 Nginx。

代码语言:dockerfile
复制
FROM node:18-alpine AS build-stage
COPY package.json ./
RUN npm config set registry https://registry.npmmirror.com && npm install
COPY ./ .
RUN npm run build

FROM nginx:alpine as production-stage
ENV TZ=Asia/Shanghai
COPY nginx.conf /etc/nginx/nginx.conf
RUN rm -rf /usr/share/nginx/html/*
COPY --from=build-stage /dist /usr/share/nginx/html/app
EXPOSE 8080

# set the container to run Nginx in the foreground
ENTRYPOINT ["nginx", "-g", "daemon off;"]

以上就是如何使用 Dockerfile 为不同的编程语言和框架创建 Docker 镜像的实践。希望这篇博客对你有所帮助。如果你有任何问题或建议,欢迎在评论区留言。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Python
  • Go
  • Java
  • Vue
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档