Dockerfile另一种使用普通用户启动的方式

ops/2025/1/23 14:37:34/

基础镜像的Dockerfile

# 使用 Debian 11.9 的最小化版本作为基础镜像  
FROM debian:11.11# 维护者信息  
LABEL maintainer="caibingsen"  # 复制自定义的 sources.list 文件(如果有的话)  
COPY sources.list /etc/apt/sources.list  # 创建一个目录来存放 JDK  
RUN mkdir -p /usr/java/jdk1.8.0_191-amd64 && mkdir /hskj && useradd -m bjxtb -d /hskj && chown bjxtb. /hskj# 安装必要的依赖,并清理 apt 缓存  
#RUN apk add --no-cache procps && apt-get install -y procps
RUN apt-get update &&  apt-get install -y locales && \apt-get install -y --no-install-recommends procps curl telnet net-tools vim && \apt-get install gosu && \rm -rf /var/lib/apt/lists/*# 生成zh_CN.UTF-8 locale
RUN sed -i 's/# zh_CN.UTF-8 UTF-8/zh_CN.UTF-8 UTF-8/' /etc/locale.gen && \locale-gen
# 设置环境变量,以支持中文
ENV LANG zh_CN.UTF-8
ENV LANGUAGE zh_CN:zh
ENV LC_ALL zh_CN.UTF-8# 将 JDK 目录复制到容器中(假设你已经在构建上下文中准备好了这个目录)  
COPY jdk1.8.0_191-amd64 /usr/java/jdk1.8.0_191-amd64 # 设置 JAVA_HOME 和 PATH 环境变量  
ENV JAVA_HOME=/usr/java/jdk1.8.0_191-amd64
ENV PATH=$JAVA_HOME/bin:$PATH  ENV TZ Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime# 调整系统配置  
RUN echo "fs.file-max = 65536" >> /etc/sysctl.conf && \  echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf && \  echo "net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.conf && \  echo "net.ipv4.ip_local_port_range = 1024 65000" >> /etc/sysctl.conf && \  echo "vm.swappiness = 10" >> /etc/sysctl.conf && \  echo "net.core.somaxconn=2048" >> /etc/sysctl.conf && \  echo "* soft nofile 60000" >> /etc/security/limits.d/user-nofile.conf && \  echo "* hard nofile 60000" >> /etc/security/limits.d/user-nofile.conf && \  echo "* soft nproc 50000" >> /etc/security/limits.d/20-nproc.conf && \  echo "root soft nproc unlimited" >> /etc/security/limits.d/20-nproc.conf#增加entrypoint.sh
ADD ./entrypoint.sh /entrypoint.sh##给entrypoint.sh增加权限
RUN  chmod +x /entrypoint.sh# 容器启动时执行的命令  
ENTRYPOINT ["sh","/entrypoint.sh"]

启动脚本entrypoint.sh 

#!/bin/bash
set -e
# 先更改文件和目录的所有权
chown -R bjxtb /hskj
# 以 bjxtb 身份运行其他命令
exec gosu bjxtb "$@"

 这行注释说明了 exec 命令的目的。

  • exec gosu bjxtb "$@" 命令执行以下操作:
    • gosu 是一个类似于 sudo 的工具,但它是为 Docker 容器设计的,用于在容器中切换用户。
    • bjxtb 是要切换到的用户。
    • "$@" 是一个特殊的 shell 参数,它代表脚本接收到的所有位置参数(即传递给脚本的命令行参数)。
    • exec 命令用于替换当前 shell 进程为 gosu 进程。这意味着脚本中 exec 后面的任何命令都不会被执行,因为 exec 已经用 gosu 替换了当前的 shell。gosu 然后以 bjxtb 用户的身份执行传入的命令。

这个脚本非常适合在 Docker 容器中使用,其中可能需要以非 root 用户的身份运行应用程序。通过更改文件所有权并以特定用户身份运行应用,可以增强容器的安全性。

应用服务的dockerfile>dockerfile文件

FROM hub./base_java/debian-jdk8-base:1.0.4
WORKDIR /hskj/appCOPY ./app.jar /hskj/app/app.jar
COPY ./script/* /bin
RUN chmod 774 /bin/*.shEXPOSE 8080
#
CMD ["sh", "/bin/start.sh"]

如果对你有帮助,一块也是爱


http://www.ppmy.cn/ops/152490.html

相关文章

Flink底层架构与运行流程

这张图展示了Flink程序的架构和运行流程。 主要组件及功能: Flink Program(Flink程序): 包含Program code(程序代码),这是用户编写的业务逻辑代码。经过Optimizer / Graph Builder&#xff08…

树莓集团助力东盟桥头堡,广西数字贸易园崛起

在 “一带一路” 倡议的宏大背景下,树莓集团以卓越的战略眼光与雄厚实力,积极投身于区域经济发展建设,助力广西数字贸易园在东盟桥头堡强势崛起,成为推动数字贸易发展的关键力量。 广西,凭借其独特的地理位置&#xf…

群晖部署-Calibreweb

最近家里搞了台群晖,准备部署个Calibreweb看看电子书,看了好多部署的教程老是不太成功,要么报错要么有问题的,很难搞。下面将部署流程分享一下,给大家参考,少走点弯路 镜像的选择 我们使用johngong/calibr…

国产编辑器EverEdit -重复行

1 重复行 1.1 应用场景 在代码或文本编辑过程中, 经常需要快速复制当前行,比如,给对象的多个属性进行赋值。传统的做法是:选中行-> 复制-> 插入新行-> 粘贴,该操作有4个步骤,非常繁琐。 那有没…

Kotlin Bytedeco OpenCV 图像图像49 仿射变换 图像裁剪

Kotlin Bytedeco OpenCV 图像图像49 仿射变换 图像裁剪 1 添加依赖2 测试代码3 测试结果 在OpenCV中,仿射变换(Affine Transformation)和透视变换(Perspective Transformation)是两种常用的图像几何变换方法。 变换方…

电子电气架构 --- 车载通信诊断

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…

Unity自学之旅03

Unity自学之旅03 Unity自学之旅03📝 碰撞体 Collider 基础定义与作用常见类型OnCollisionEnter 事件碰撞触发器 🤗 总结归纳 Unity自学之旅03 📝 碰撞体 Collider 基础 定义与作用 定义:碰撞体是游戏中用于检测物体之间碰撞的组…

商汤善惠获金沙江创投领投A轮融资,聚焦零售AI业务

1月20日,商汤善惠宣布完成A轮融资,本轮融资由金沙江创投数千万元领投,微木资本、嘉实基金和金弘基金等知名资管平台和产业资本数千万元跟投,鞍羽资本担任长期财务顾问。 此次融资将重点投向零售AI算法研发创新、海外市场拓展战略…