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