有用的 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 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号