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"]
如果对你有帮助,一块也是爱