在这篇文章中,我将分享如何使用 Dockerfile 为不同的编程语言和框架创建 Docker 镜像。我们将覆盖 Java、Python、Vue3 和 Go。
对于 Python,我们从一个基于 Python 3.10.12 的 Docker 镜像开始。我们设置环境变量 TZ
和 LANG
,然后将工作目录切换到 /app/YOUR_PROJECT
。
接下来,我们复制 requirements.txt
文件,并使用 pip3
命令安装依赖项。然后,我们复制源代码和 .env
文件。
最后,我们暴露端口 8080,并设置 ENTRYPOINT
以启动我们的 Python 应用程序。
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 mod init YOUR_PROJECT
go mod tidy
然后,我们创建一个 Dockerfile。我们从一个基于 Go 1.20.2 的 Docker 镜像开始,设置时区,并将工作目录切换到 /app
。
接下来,我们复制 Go 源代码,并运行 go mod init
和 go mod tidy
命令来初始化 Go 模块。然后,我们使用 go build
命令构建我们的应用程序。
最后,我们复制 .env
文件,暴露端口 8080,并设置 CMD
以启动我们的 Go 应用程序。
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(
首先,我们从一个基于 Maven 和 OpenJDK 8 的 Docker 镜像开始构建我们的 Java 应用程序。然后,我们将 pom.xml
和源代码复制到临时目录,并运行 mvn package
命令来构建我们的应用程序。
在第二阶段,我们从一个基于 Alpine Linux 和 OpenJDK 8 的 Docker 镜像开始,更新系统,添加 libc6-compat
包,并创建一个符号链接。然后,我们将工作目录切换到 /app/
,并从构建阶段复制我们的应用程序和资源文件。
最后,我们设置 ENTRYPOINT
以启动我们的 Java 应用程序。
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"]
对于 Vue3 项目,可以使用 Vite 构建和打包,并通过 Nginx 对外提供服务
首先添加一个 Nginx 的配置文件
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。
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 删除。