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"]

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

相关推荐
小毛驴85016 分钟前
Linux 后台启动java jar 程序 nohup java -jar
java·linux·jar
zwjapple22 分钟前
docker-compose一键部署全栈项目。springboot后端,react前端
前端·spring boot·docker
好好学习啊天天向上1 小时前
世上最全:ubuntu 上及天河超算上源码编译llvm遇到的坑,cmake,ninja完整过程
linux·运维·ubuntu·自动性能优化
tan180°2 小时前
MySQL表的操作(3)
linux·数据库·c++·vscode·后端·mysql
代码老y2 小时前
Docker:容器化技术的基石与实践指南
运维·docker·容器
典学长编程3 小时前
Linux操作系统从入门到精通!第二天(命令行)
linux·运维·chrome
wuk9983 小时前
基于MATLAB编制的锂离子电池伪二维模型
linux·windows·github
DuelCode3 小时前
Windows VMWare Centos Docker部署Springboot 应用实现文件上传返回文件http链接
java·spring boot·mysql·nginx·docker·centos·mybatis
独行soc6 小时前
#渗透测试#批量漏洞挖掘#HSC Mailinspector 任意文件读取漏洞(CVE-2024-34470)
linux·科技·安全·网络安全·面试·渗透测试
BD_Marathon6 小时前
Ubuntu下Tomcat的配置
linux·ubuntu·tomcat