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

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

相关推荐
紫郢剑侠1 分钟前
飞秋@Windows +iptux@Linux,打造内网跨平台IM环境
linux·运维·服务器·im·qq
保持低旋律节奏5 分钟前
linux——调试
linux·运维·服务器
牛奶咖啡1311 分钟前
Linux系统故障排查思路实践教程(下)
linux·运维·服务器·su命令切换用户问题解决·文件打开过多问题解决·linux网络故障问题解决·linux故障排查思路
coder4_33 分钟前
Linux 数据同步全攻略:NFS 共享、inotify+rsync 与 sersync 实战指南
linux·rsync·文件共享·nfs·数据同步·inotify·实时备份
一苓二肆1 小时前
代码常用工具使用
git·vscode·docker·github·vim
Lynnxiaowen1 小时前
今天我们继续学习kubernetes内容Helm
linux·学习·容器·kubernetes·云计算
weixin_521431121 小时前
Docker容器技术
运维·docker·容器
Bigan(安)1 小时前
【奶茶Beta专项】【LVGL9.4源码分析】08-theme主题管理
linux·c语言·mcu·arm·unix
小汐睡着了1 小时前
解决虚拟机VMware与宿主机网络不通的问题-error
linux·网络·redhat
xdxghy09211 小时前
mini centos7+k3s部署(镜像拉取解决版)
linux·运维·服务器·阿里云·运维开发