Loading

有关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

posted @ 2022-08-30 16:15  azureology  阅读(545)  评论(0)    收藏  举报