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

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

相关推荐
zjj5875 小时前
Docker使用ubuntu
java·docker·eureka
我是唐青枫5 小时前
Linux ar 命令使用详解
linux·运维·服务器
mljy.5 小时前
Linux《进程概念(上)》
linux
IEVEl5 小时前
Centos7 开放端口号
linux·网络·centos
herogus丶5 小时前
【LLM】Elasticsearch作为向量库入门指南
elasticsearch·docker·langchain
我要升天!6 小时前
Linux中《环境变量》详细介绍
linux·运维·chrome
MobiCetus7 小时前
有关pip与conda的介绍
linux·windows·python·ubuntu·金融·conda·pip
cleble7 小时前
SpringCould微服务架构之Docker(5)
docker
weixin_428498497 小时前
Linux系统perf命令使用介绍,如何用此命令进行程序热点诊断和性能优化
linux·运维·性能优化
Source、8 小时前
Zabbix监控K8s集群
docker·kubernetes·zabbix