有用的 Docker Entrypoint 脚本范例

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" ]; then
  export NODE_ENV=production
fi

echo "NODE_ENV is set to $NODE_ENV"

# 安装依赖
echo "Installing dependencies..."
npm install

# 运行数据库迁移
if [ "$NODE_ENV" = "production" ]; then
  echo "Running database migrations..."
  npm run migrate
fi

# 检查是否传递了参数,如果是,则执行参数命令
if [ "${1:0:1}" = '-' ]; then
  set -- 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
posted @   老夫写代码  阅读(13)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示