当前位置: 首页 > article >正文

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

基础镜像的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文件

FROM hub./base_java/debian-jdk8-base:1.0.4
WORKDIR /hskj/app

COPY ./app.jar /hskj/app/app.jar
COPY ./script/* /bin
RUN chmod 774 /bin/*.sh

EXPOSE 8080
#
CMD ["sh", "/bin/start.sh"]

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


http://www.kler.cn/a/512353.html

相关文章:

  • 【正则表达式】从0开始学习正则表达式
  • JavaScript系列(36)--微服务架构详解
  • C语言:位段
  • Ubuntu 24.04 LTS 更改软件源
  • OpenHarmony-7.IDL工具
  • Linux(DISK:raid5、LVM逻辑卷)
  • 高效建站指南:通过Portainer快速搭建自己的在线网站
  • 开源许可证(Open Source Licenses)
  • 【React】类组件更新的底层逻辑
  • wordpress网站发布失败:此响应不是合法的JSON响应
  • 模版字符串复制粘贴支持换行
  • 【Block总结】TFF和SFF模块,时间和尺度的特征融合|即插即用
  • 【大数据2025】Yarn 总结
  • Android 11.0 第三方app接收不到开机广播问题的解决以及开机自启动功能实现二
  • Agent Laboratory: Using LLM Agents as Research Assistants 论文简介
  • 低代码系统-UI设计器核心介绍
  • MATLAB基础应用精讲-【数模应用】误差函数(erf)(附Java、python、R语言和MATLAB代码实现)
  • 高效安全文件传输新选择!群晖NAS如何实现无公网IP下的SFTP远程连接
  • Spring MVC:设置响应
  • Kafka 日志存储 — 文件目录及日志格式
  • Objective-C语言的数据库交互
  • goland map学习-实践使用练习:判断存在及遍历
  • 【计算机网络】传输层协议TCP与UDP
  • FreeRTOS系统移植
  • 在Vue中,<img> 标签的 src 值
  • 点云目标检测训练数据预处理---平面拟合与坐标转换(python实现)