• 有关Dockerfile配置的那些事


    SEO

    • Dockerfile配置正确时区信息
    • Dockerfile调用apt install取消交互
    • Dockerfile创建用户并设置密码
    • Docker使用s6配置自启动服务
    • Docker配置sshd服务自启动
    • Docker中使用crontab
    • 有关gosu和su/sudo的区别

    前言

    为提高image传输效率,使用Dockerfile进行构建似乎成为首选。

    实操

    构建之前先引入概念,使用docker build -t your/container:latest .进行构建
    会将当前整个目录作为上下文(context)传入docker daemon进行后续处理
    故尽量选择干净的文件夹进行构建,此外使用ADD/COPY命令导入./之外的文件会报错,
    每步操作(RUN, ADD, COPY)对应增加一层layer故合并可以降低复杂度。

    安装环境

    ubuntu:20.04镜像为例

    FROM ubuntu:20.04
    RUN apt-get update && \
        DEBIAN_FRONTEND=noninteractive apt-get install -yq \
        tzdata s6 ssh cron sudo psmisc vim && \
        ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
        dpkg-reconfigure -f noninteractive tzdata && \
        mkdir /run/sshd
    

    有关时区网上说ENV TZ="Asia/Shanghai"也可以,经测试date输出正常
    但链接/etc/localtime -> /usr/share/zoneinfo//UTC有误,
    有关apt-get取消交互的方法其实apt-get install -qq -y也可以,
    注意apt没有-q参数,结尾的mkdir /run/sshd省略会导致sshd启动报错。

    用户配置

    使用useradd命令进行用户配置,其中-p参数需要传入加密后的密码而非明文
    建议通过如下方式获取,密码以ubuntu为例

    $ openssl passwd -1 ubuntu
    $1$iFaj7WOK$E6tAyVen.qs/5rKGMpftl/
    

    对应脚本则为

    RUN useradd -rm -d /home/ubuntu -s /bin/bash -G sudo \
        -p '$1$iFaj7WOK$E6tAyVen.qs/5rKGMpftl/' ubuntu
    

    自启动项

    由于缺少init/systemd作为pid1管理进程,这里引入s6作为替代。
    s6语法简单,采用文件夹进行配置,通过/bin/s6-svscan /etc/s6/部署。

    s6
    ├── app
    │   └── run
    ├── cron
    │   └── run
    └── sshd
        └── run
    

    每层对应一个服务,s6会自动启动服务的run脚本并守护。

    $ cat s6/cron/run 
    #!/bin/sh
    # Crontabs are located by default in /var/spool/cron/crontabs/
    # The default configuration is also calling all the scripts in /etc/periodic/${period}
    exec /usr/sbin/cron
    
    $ cat s6/sshd/run 
    #!/bin/sh
    exec /usr/sbin/sshd -D
    

    上述服务默认启动为root权限且run内部无需调用nohup启动。
    对于需要指定用户的服务则需要搭配gosu完成

    $ cat s6/app/run 
    #!/bin/sh
    exec gosu ubuntu /opt/app/daemon -d
    

    使用su - ubuntu -c "/opt/app/daemon -d"会使得daemon派生于额外的su进程。
    同理用gosu ubuntu crontab /home/ubuntu/cronfile给指定用户安装计划任务。
    最后使用ENTRYPOINT语句进行注入,防止CMD被用户启动命令覆盖。

    COPY ./s6 /etc/s6
    ENTRYPOINT ["/bin/s6-svscan", "/etc/s6/"]
    

    参考

    Set timezone in your docker image - DEV Community ‍‍
    linux - How to automatically add user account AND password with a Bash script? - Stack Overflow
    gogs/docker at main · gogs/gogs
    dockerfile - Docker using gosu vs USER - Stack Overflow

  • 相关阅读:
    好用的Win7下硬盘分区软件:Acronis Disk Director Suite
    SQL Server 相关create操作语句
    我也有博客了
    N层构架如何实现
    SQL相关增删改查语句
    1.MVC的工作流程
    回顾去年以来读过的书
    [Architecture]Facebook Chat
    [Tips]解决make_sock: could not bind to address 0.0.0.0:XXXX
    Emacs中的按键组合
  • 原文地址:https://www.cnblogs.com/azureology/p/16639506.html
Copyright © 2020-2023  润新知