有用的 Docker Entrypoint 脚本范例
Docker 容器的 ENTRYPOINT
指令允许我们配置一个可执行的命令,容器启动时首先运行这个命令。通过编写一个合理的 Entrypoint 脚本,可以确保容器启动时执行必要的初始化操作,并使容器更具弹性和灵活性。下面是一个专业的 Docker Entrypoint 脚本范例,涵盖常见的初始化步骤。
示例:用于 Node.js 应用的 Entrypoint 脚本
假设我们有一个基于 Node.js 的应用,我们希望在容器启动时执行以下步骤:
- 安装依赖项。
- 运行数据库迁移。
- 启动应用。
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
总结
通过这个 Entrypoint 脚本,您可以确保在 Docker 容器启动时执行必要的初始化步骤,并且容器可以根据不同的运行时环境进行相应的配置和操作。这个范例展示了如何编写一个灵活且功能强大的 Entrypoint 脚本,使您的 Docker 容器更加可靠和易于管理。