Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Dockerfile 实践:构建 Java、Python、Vue 和 Go 环境

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

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

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

Python

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

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

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

代码语言:dockerfile
AI代码解释
复制
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
AI代码解释
复制
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
AI代码解释
复制
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
AI代码解释
复制
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
AI代码解释
复制
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
AI代码解释
复制
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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Docker 快速入门之 Dockerfile
在容器环境中,我们可以通过容器创建一个我们自定义过的镜像,那么我们是否可以直接通过基础的镜像直接自定义镜像呢?答案当然是可以的,在 Docker 中我们可以从名为 Dockerfile 的文件中读取指令并且自动构建镜像。在本文中,将介绍 Dockerfile 的基本语法以及基本知识。
Debian中国
2018/12/20
4950
Dockerfile 最佳实践及示例
Dockerfile 最佳实践已经出现在官方文档中,地址在 Best practices for writing Dockerfiles[1]。如果再写一份最佳实践,倒有点关公门前耍大刀之意。因此本篇文章是对官方文档的翻译,理解,扩展与示例补充
山月
2020/05/24
1.2K0
【Java】程序制作Docker镜像 推荐方案
随着我们分布式的观念在各个领域使用,docker容器也逐渐的背大家所认可和使用,那么我们想制作容器就得有镜像如何制作镜像呢?请往下看,Dockerfile就是制作镜像的原始武器: Dockerfile由一行行命令语句组成,并且支持用“#”开头作为注释,一般的,Dockerfile分为四部分:基础镜像信息,维护者信息,镜像操作指令和容器启动时执行的指令。
瑞新
2021/12/06
2.1K0
【Java】程序制作Docker镜像 推荐方案
Docker 摸门级简易手册
Dockerfile 文件由一系列指令组成。每个指令都描述了构建镜像的某个步骤。Docker 可以通过读取 Dockerfile 中的指令自动构建镜像。Dockerfile 是一个文本文档,其中包含用户可以在命令行上调用来组装映像的所有命令。
双鬼带单
2023/09/11
3660
Docker 摸门级简易手册
【云原生 | Docker篇】实战Dockerfile(五)
Dockerfile基础知识已经在上一篇做了详细介绍,如果还不是很清楚的同学可以点击传送门再复习一遍。
Lansonli
2022/05/11
8730
【云原生 | Docker篇】实战Dockerfile(五)
万字长文带你看全网最详细Dockerfile教程
Dockerfile是用于构建Docker容器镜像的文本文件,它包含了一系列指令和配置,用于描述如何组装一个Docker容器的环境。通过Dockerfile,你可以自动化地构建镜像,确保在不同的环境中都可以复现相同的容器。Dockerfile中的指令可以指定从哪个基础镜像开始构建、复制文件到镜像中、安装软件包、设置环境变量、暴露端口、运行命令等等。每个指令都会在镜像的构建过程中创建一个新的镜像层,这些层构成了最终镜像的结构。这种分层结构让镜像的构建更加高效,同时也方便了镜像的复用和共享。以下是一个简单的Dockerfile示例:
用户1107783
2023/09/11
11.5K2
万字长文带你看全网最详细Dockerfile教程
走进Docker的世界--(库存学习笔记)
介绍docker的前世今生,了解docker的实现原理,以Django项目为例,带大家如何编写最佳的Dockerfile构建镜像。通过本章的学习,大家会知道docker的概念及基本操作,并学会构建自己的业务镜像,并通过抓包的方式掌握Docker最常用的bridge网络模式的通信。
误入歧途
2024/05/08
2820
docker 实践手册
其他参考 https://blog.csdn.net/styshoo/article/details/55657714
orientlu
2020/04/18
1.1K0
Docker部署常见应用大全
1、Emqx #!/bin/bash docker stop emqttd-docker-v2.3.11 docker rm emqttd-docker-v2.3.11 docker run -tid --name emqttd-docker-v2.3.11 -p 1883:1883 -p 8083:8083 -p 8883:8883 -p 8084:8084 -p 18083:18083 -p 6000:6999 emqttd-docker-v2.3.11 2、MySQL #!/bin/bash dock
院长技术
2021/02/19
7180
《Docker极简教程》--Dockerfile--Dockerfile的基本语法
Dockerfile是一种文本文件,用于定义Docker镜像的内容和构建步骤。它包含一系列指令,每个指令代表一个构建步骤,从基础镜像开始,逐步构建出最终的镜像。通过Dockerfile,用户可以精确地描述应用程序运行环境的配置、依赖项安装、文件复制等操作。这使得应用程序的部署和分发变得更加可控和可重复。Dockerfile的内容可以根据需求自定义,允许开发者根据应用程序的特性和需求来灵活配置镜像的构建过程,从而实现高效、可靠的容器化部署。
喵叔
2024/05/24
3.2K0
Docker | 加速开发流程的 Dockerfile 最佳实践
Dockerfile 是创建 Docker 镜像的起点,该文件提供了一组定义良好的指令,可以让我们复制文件或文件夹,运行命令,设置环境变量以及执行创建容器镜像所需的其他任务。编写 Dockerfile 来确保生成的镜像安全、小巧、快速构建和快速更新非常重要。
咸鱼学Python
2020/05/18
1.6K0
Docker | 加速开发流程的 Dockerfile 最佳实践
个人单机服务器微服务实践
seth-shi
2023/12/18
2040
个人单机服务器微服务实践
基于Dockerfile构建容器镜像的最佳实践
随着应用容器化部署的大规模迁移以及版本迭代的加快,优化基础设施之docker镜像主要有以下目的
仙人技术
2021/11/25
2.2K0
3.Docker学习之Dockerfile
描述:Dockerfile是一个文本格式的配置文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。 用户可以使用Dockerfile快速创建自定义的镜像;通过它所支持的内部指令,以及使用它创建镜像的基本过程,Docker拥有”一点修改代替大量更新”的灵活之处;
全栈工程师修炼指南
2022/09/28
1.4K0
3.Docker学习之Dockerfile
掌握这 5 个技巧,让你的 Dockerfile 像个大师!
Docker 是一种容器技术,它可以在操作系统上创建多个相互隔离的容器。容器内独立安装软件、运行服务。
神说要有光zxg
2023/08/29
6160
掌握这 5 个技巧,让你的 Dockerfile 像个大师!
3.Docker学习之Dockerfile
描述:Dockerfile是一个文本格式的配置文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。 用户可以使用Dockerfile快速创建自定义的镜像;通过它所支持的内部指令,以及使用它创建镜像的基本过程,Docker拥有”一点修改代替大量更新”的灵活之处;
全栈工程师修炼指南
2020/10/23
2K0
3.Docker学习之Dockerfile
Dockerfile命令及实践构建一个网站
dockerfile用于构建docker镜像的,部署一个用于运行你所需的容器环境。相当一个脚本,通过dockerfile自己的指令,来构建软件依赖、文件依赖、存储、
NeilNiu
2023/02/25
1.4K0
Docker 镜像构建之 Dockerfile
在 Docker 中构建镜像最常用的方式,就是使用 Dockerfile。Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。官方文档:https://docs.docker.com/engine/reference/builder/
贾维斯Echo
2024/03/21
4.8K0
Docker 镜像构建之 Dockerfile
使用Dockerfile
在前面我们简单提到了如何使用Dockerfile文件来创建镜像,鉴于这种方式在日常工作中使用的较为频繁,因此这里专门拿出一篇文章来研究如何使用Dockerfile配置文件来创建镜像。这里会介绍Dockerfile比较典型的基本结构及其支持的众多指令,然后通过这些指令来编写定制镜像的Dockerfile文件,接着便使用该Dockerfile文件来生成镜像,最后会结合笔者自身工作经验来谈谈一些使用Dockerfile的最佳实践。
啃饼思录
2021/01/12
9040
docker | dockerfile指令详解
Dockerfile用于构建docker镜像, 实际上就是把在linux下的命令操作写到了Dockerfile中, 通过Dockerfile去执行设置好的操作命令, 保证通过Dockerfile的构建镜像是一致的.
Amadeus
2023/04/17
2K0
相关推荐
Docker 快速入门之 Dockerfile
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档