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

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

相关推荐
拂拉氏7 分钟前
【知识讲解】 Linux中vim编辑器的学习与使用
linux·编辑器·vim
苏灿烤鱼38 分钟前
一套进程代替八件套,桌面更稳还是单点更大
linux·github·shell
刘梦薇42 分钟前
SSH连接失败connection reset解决办法
linux·运维·ubuntu·ssh·腾讯云
Rsingstarzengjx1 小时前
stm32m157 U-boot 测试
linux·运维·服务器
江湖有缘1 小时前
5款开源wiki知识库工具,支持Docker快速部署!
docker·容器·开源
月落汀兰2 小时前
Linux Nginx全套实战通关|静态站点/虚拟主机/HTTPS/PHP/反向代理/七层负载均衡,每行命令逐参数拆解
linux·nginx·https
ShineWinsu2 小时前
对于C++:缓冲区管理的详细解析
linux·c++·面试·编程·笔试·io·缓冲区
张小姐的猫2 小时前
【Linux】网络编程 —— 传输层协议 TCP(下)
linux·运维·服务器·网络·tcp/ip·http·php
程序员AlbertTu3 小时前
第2章 上手 Linux:环境与文件操作
linux·运维·服务器
云上飞476369623 小时前
Windows WSL2 + Docker 环境下NVIDIA PhysicsNeMo 安装指南
windows·docker·physicsai·physicsnemo