有用的 Docker Entrypoint 脚本范例

news/2025/1/31 21:43:58/文章来源:https://www.cnblogs.com/she20250124/p/18695989

Docker 容器的 ENTRYPOINT 指令允许我们配置一个可执行的命令,容器启动时首先运行这个命令。通过编写一个合理的 Entrypoint 脚本,可以确保容器启动时执行必要的初始化操作,并使容器更具弹性和灵活性。下面是一个专业的 Docker Entrypoint 脚本范例,涵盖常见的初始化步骤。

示例:用于 Node.js 应用的 Entrypoint 脚本

假设我们有一个基于 Node.js 的应用,我们希望在容器启动时执行以下步骤:

  1. 安装依赖项。
  2. 运行数据库迁移。
  3. 启动应用。

Dockerfile

首先,我们定义一个 Dockerfile:

# 使用官方的 Node.js 镜像作为基础镜像
FROM node:14# 创建工作目录
WORKDIR /usr/src/app# 复制 package.json 和 package-lock.json
COPY package*.json ./# 安装应用依赖
RUN npm install# 复制应用源代码
COPY . .# 拷贝 Entrypoint 脚本
COPY entrypoint.sh /usr/src/app/# 确保脚本有执行权限
RUN chmod +x /usr/src/app/entrypoint.sh# 设置 Entrypoint
ENTRYPOINT ["/usr/src/app/entrypoint.sh"]# 暴露应用端口
EXPOSE 3000# 指定默认启动命令
CMD ["npm", "start"]
​
 
 

Entrypoint 脚本

下面是 entrypoint.sh 脚本的内容:

#!/bin/bash
set -e# 检查是否存在 NODE_ENV 环境变量,否则设置为默认值
if [ -z "$NODE_ENV" ]; thenexport NODE_ENV=production
fiecho "NODE_ENV is set to $NODE_ENV"# 安装依赖
echo "Installing dependencies..."
npm install# 运行数据库迁移
if [ "$NODE_ENV" = "production" ]; thenecho "Running database migrations..."npm run migrate
fi# 检查是否传递了参数,如果是,则执行参数命令
if [ "${1:0:1}" = '-' ]; thenset -- npm start "$@"
fi# 执行 CMD 命令
exec "$@"
​
 
 

解释

  • 环境变量检查和设置:脚本首先检查是否存在 NODE_ENV 环境变量,如果不存在,则设置为 production
  • 安装依赖:每次容器启动时,脚本都会执行 npm install 以确保依赖项是最新的。
  • 数据库迁移:如果环境是 production,脚本会运行数据库迁移命令。
  • 命令执行:脚本检查是否传递了任何参数,如果有,则执行传递的参数作为命令;否则,执行默认的 npm start 命令启动应用。

运行和测试

构建 Docker 镜像:

docker build -t my-node-app .
​
 
 

运行容器:

docker run -d -p 3000:3000 my-node-app
​
 
 

您可以通过传递不同的参数来覆盖默认行为,例如运行数据库迁移:

docker run -d -p 3000:3000 my-node-app npm run migrate

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/877406.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CF998

A link总共就三组,看一下每一组如果满足要让它是多少,看看最多有几个相同的,最多有几个相同的就满足这些,就可以满足这么多组。点击查看代码 #include<bits/stdc++.h>using namespace std;int a[10]; int c[5];void qwq(){cin >> a[1] >> a[2] >> …

计算机网络学习-HCIP-02

TCP、UDP TCP:可靠性高 适合对文件传输的完整性要求高,但是对延迟不敏感 电子邮件 游戏或者应用:更新客户端的时候,就是用TCP协议来更新 游戏更新完了,进去游戏开局了,这时候就用UDP协议 UDP:速度快 双十一、618,电商服务器如何顶住压力的? 使用多台服务器 cdn技术,不…

mybatis的demo程序

事实上,关于mybatis框架的所有过程,均可见于 https://mybatis.net.cn/getting-started.html 一 创建数据库 该部分就是简单的sql语句创建数据库和数据表的过程,不多赘婿,结果如图所示 二 创建maven项目,导入依赖 首先创建maven项目,注意将maven的地址改为自己的maven,而…

lightroom调色笔记

1.关于色彩关系任意两种颜色的混合都会是另一种颜色的互补色 RGB模式下: 红绿混合是黄,黄是蓝色的互补色 蓝绿混合是青色,红色是青色互补色 红蓝混合是品色,品色是绿色的互补色 2.亮度的区域划分3.关于曲线上的锚点 使用ctrl在画面上可以在曲线上找到需要调整的位置 画面偏…

05. 用户组管理

一、什么是用户组管理每一个用户都有一个用户组,系统可以对一个用户组的所有用户进行集中管理。不同 Linux 系统对用户组的规定有所不同。Linux 下的用户属于与它同名的用户组,这个用户组在创建用户时同步创建。用户组的管理涉及用户组的添加、删除和修改。组的增加、删除和修…

华为mate70pro+ 对比 小米10ultra 高像素模式

华为 拍摄一张大概要5-7秒 小米 只需不到1秒 华为明显要强华为小米 华为小米

Qt Quick与ROS通过UDP协议实现网络通信

实现目标 项目需要编写一个无人机地面站,无人机在ROS系统下运行,地面站需要与无人机建立通信,能够控制无人机起飞、降落、飞行,并能够接收无人机的状态信息。 该无人机系统的组成如下图所示:地面站通过无线网络与无人机上位机建立通信,上位机负责将飞控的无人机状态数据转…

5.C++提高编程

C++提高编程。C++提高编程 本阶段主要针对C++泛型编程和STL技术做详细讲解,探讨C++更深层的使用 1 模板 1.1 模板的概念 模板就是建立通用的模具,大大提高复用性 例如生活中的模板 一寸照片模板:PPT模板:模板的特点: 模板不可以直接使用,它只是一个框架 模板的通用并不是…

又来新活了!AI电商搜索,或是下一个90亿美元独角兽?

全新体验,大模型驱动的对话式购物搜索。图源:https://www.shopencore.ai/ 全新体验,大模型驱动的对话式购物搜索。 Encore, 由2024年10月成立的美国初创公司开发。定位于二手商品对话式购物搜索,最终目标为个人购物助理。 2024年12月3日获得YC(Y combinator)的50万美元天使…

qq网页版下载音乐教程

点一首音乐开始播放,务必要播放界面内只有一首音乐,然后f12调试,找到audio标签;然后复制src=”” 双引号内的内容到新标签打开,然后在播放栏,右键,就可以保存音乐了,注意有的音乐是m4a格式,下载完成后还要转换成mp3。谢雨尘安-谢雨尘安的博客

gin: 校验参数时返回自定义错误信息

一,代码 1,global/validator.go package globalimport "github.com/go-playground/validator/v10"//存放GetMessages()方法 type Validator interface {GetMessages() ValidatorMessages }//校验信息 type ValidatorMessages map[string]string// GetErrorMsg方法,…

VM笔记_Modbus通信触发流程

1,通信触发流程 ①通信配置② 接收事件新建③全局触发-事件触发4, 通信心跳配置和启用5, 效果展示