docker笔记9--Docker镜像中使用crontab

docker笔记9--Docker镜像中使用crontab

1 介绍

工作中经常会使用cron,物理机上使用非常简单,但是大部分docker容器中默认没有cron且没有启动cron服务,直接使用不太方便。因此,笔者根据日常经验,将cron服务打包到docker镜像中,实现容器启动后定时执行cron中的任务。
该方法仅仅在ubuntu系统中测试过,其它系统中crontab保存的路径是否为/var/spool/cron/crontabs/笔者暂未逐一测试。若使用其它基础系统,建议先确认crontab的保存路径后,再参考笔者方法加以修改。

2 打包方法

2.1 思路

  1. 系统中要安装cron
    默认基础镜像可能没有安装cron,因此需要apt-get install cron -y
  2. 配置cron命令
    正常情况下,直接在服务器中通过crontab -e 来编辑crontab;而实际部署服务的时候不合适手动添加cron命令,因此需要提前配置好crontab的文件,并把它拷贝到镜像 /var/spool/cron/crontabs/ 目录下(该目录下的文件为cron服务默认存储的位置,每个配置cron命令的用户都会在该目录下生成一个对应的文件),格式为 /var/spool/cron/crontabs/user_name(若为root用户则将user_name 更改为root即可)。
  3. 确保容器启动时候运行cron服务
    默认情况下cron服务没有启动,因此需要在容器启动命令中手动添加一个service cron start 来启动cron服务。

2.2 案例

本案例基于ubuntu系统,安装python3,部署一个基础flask app,并且每分钟都将系统当前时间写入/home/flask/dt.txt 中。
该案例依赖 app.py Dockerfile readme.md root 等4个文件。
app.py

from flask import Flask

app = Flask(__name__)


@app.route('/')
def hello_root():
    print('v1.2 Hello Root!\n')
    return 'v1.2 Hello Root!\n'


@app.route('/hello')
def hello_world():
    print('v1.2 Hello World!\n')
    return 'v1.2 Hello World!\n'


if __name__ == '__main__':
    app.run(host='0.0.0.0')

root

* * * * * date >/home/flask/dt.txt

Dockerfile

FROM ubuntu:20.04
RUN mkdir -p /home/flask
WORKDIR /home/flask
COPY app.py .
COPY root /var/spool/cron/crontabs/root
# COPY sources.list /etc/apt/sources.list
RUN apt-get update && apt-get install cron -y && apt-get install curl -y && apt-get install python3 -y && apt-get install python3-pip -y && pip3 install flask
CMD  service cron start && python3 app.py

readme.md

# ubuntu_cron
docker build -t ubuntu_cron:v1.0 .
docker run --name=ubuntu_cron -d -p 5000:5000 ubuntu_cron:v1.0
docker tag ubuntu_cron:v1.0 dockerhub.xxx.com/xg/ubuntu_cron:v1.0

3 测试

通过上述readme.md 中的命令打包镜像,然后运行镜像,测试效果。
在这里插入图片描述
如上图,进入容器中发现cron进程正常启动,crontab中正常加载了定时命令,也定时向dt.txt中写入相应日期数据。

4 说明

镜像基础系统为ubuntu20.04

<think>好的,我现在需要帮助用户了解如何在纯Ubuntu系统之间同步环境和代码。首先,我得想想用户可能的场景,他们可能有两台或多台Ubuntu电脑,想要保持开发环境或代码的一致,方便在不同设备上工作。用户提到的“环境”可能包括软件包、配置文件和代码库,所以需要分别考虑这几个方面。 首先,同步代码相对直接,常用的工具是Git,比如用GitHub、GitLab或者自建的Git服务器。用户可能已经知道基本的Git操作,但也许需要指导如何设置远程仓库和自动化同步。不过用户可能更关心如何自动化,比如使用钩子或者定时任务,或者结合CI/CD流程。 然后是环境同步,这里比较复杂。环境包括安装的软件包、系统配置以及用户个人的配置(如bashrc、vimrc等)。对于软件包同步,可以使用apt-clone工具,它能够生成已安装软件包的列表,然后在另一台机器上批量安装。或者用户可能需要更详细的步骤,比如导出已安装的包列表,然后在新系统上安装。 对于配置文件,用户的家目录下有很多点文件,比如.bashrc、.vim、.config等,可以用rsync进行同步,或者使用版本控制系统,比如将dotfiles存储在Git仓库中,通过符号链接来管理。这需要用户设置仓库并克隆到各个机器,可能需要处理不同机器的特定配置,但保持公共部分同步。 另外,用户可能需要使用像Ansible这样的配置管理工具,来在多台机器上自动部署环境和配置。Ansible可以通过playbook定义需要安装的软件包、配置文件的部署等,适合更复杂的环境同步需求。不过对于普通用户来说,可能稍显复杂,需要学习成本。 还有容器化方案,比如Docker,用户可以创建一个包含所有环境和代码的Docker镜像,然后在各个系统上运行相同的容器。这样可以确保环境完全一致,但可能不适合需要频繁修改环境或代码的情况,而且需要用户熟悉Docker使用。 另外,云存储服务如Nextcloud或Syncthing可以用于同步特定目录,但可能不适合代码版本控制或环境配置的同步,更适合文件级别的同步。需要根据用户的具体需求来推荐。 总结下来,可能的步骤是: 1. 同步代码:使用Git仓库,配置远程并定期推送和拉取。 2. 同步软件包:使用apt-clone或导出包列表,用脚本安装。 3. 同步配置文件:使用Git管理dotfiles,或用rsync同步。 4. 自动化工具:如Ansible,适用于多台机器的统一配置。 5. 容器化:Docker镜像确保环境一致性。 需要考虑用户的技术水平,如果是开发者,可能更倾向于Git和Ansible;如果是普通用户,可能更简单的方法如rsync和脚本更合适。另外,提醒用户注意敏感信息(如密钥)不要上传到公共仓库,可以使用环境变量或加密管理。 可能的问题点:不同机器可能有不同的硬件或需求,需要处理配置的差异。例如,笔记本和台式机可能需要不同的电源管理设置,但开发环境应保持一致。因此,在同步时需要排除某些文件,或使用条件判断。 另外,权限问题,使用rsync或Ansible时需要确保有足够的权限,可能需要配置SSH免密登录,方便同步操作。 最后,需要给出具体的步骤示例,让用户能够一步步操作,比如如何导出软件包列表,如何设置Git远程,如何用rsync同步配置文件等。同时提醒测试恢复流程,确保在新机器上能正确应用同步的设置。</think>在纯Ubuntu系统间同步开发环境和代码,可通过以下分步方案实现: --- ### 一、代码同步(Git方案) 1. **创建远程仓库** - 使用GitHub/GitLab/Gitee或自建Git服务器(如Gitea) - 初始化本地仓库: ```bash cd ~/project git init git remote add origin 远程仓库地址 ``` 2. **自动化推送/拉取** - 添加定时任务(cron)每小时自动同步: ```bash crontab -e # 添加: 0 * * * * cd ~/project && git pull && git add . && git commit -m "AutoSync" && git push ``` --- ### 二、软件环境同步 #### 方案A:apt-clone工具 1. **导出已安装软件列表** ```bash sudo apt install apt-clone apt-clone clone ~/packages-list.tar.gz ``` 2. **同步到目标机器** ```bash scp ~/packages-list.tar.gz user@目标机器IP:~ ``` 3. **在新机器恢复环境** ```bash sudo apt-clone restore ~/packages-list.tar.gz ``` #### 方案B:手动导出列表(推荐) 1. **生成软件列表** ```bash comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n &#39;s/^Package: //p&#39; | sort -u) > ~/pkgs.txt ``` 2. **批量安装** ```bash sudo xargs -a ~/pkgs.txt apt install -y ``` --- ### 三、配置文件同步 #### 方案A:Git管理dotfiles 1. **创建dotfiles仓库** ```bash git init --bare $HOME/.dotfiles alias dotfiles=&#39;/usr/bin/git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME&#39; dotfiles config --local status.showUntrackedFiles no ``` 2. **添加配置文件** ```bash dotfiles add ~/.bashrc ~/.vimrc ~/.config/... dotfiles commit -m "Add config files" dotfiles push ``` 3. **在新机器克隆配置** ```bash git clone --bare 仓库地址 $HOME/.dotfiles dotfiles checkout # 若冲突需备份原文件 ``` #### 方案B:rsync增量同步 ```bash rsync -avz --delete ~/.bashrc ~/.ssh ~/.config user@目标机器:~/ ``` --- ### 四、高级同步(Ansible) 1. **安装Ansible** ```bash sudo apt install ansible ``` 2. **编写playbook** ```yaml # sync_env.yml - hosts: all tasks: - name: Install packages apt: name: "{{ item }}" state: present loop: "{{ pkgs }}" vars: pkgs: [git, python3, vim, ...] - name: Deploy dotfiles copy: src: ~/dotfiles/{{ item }} dest: ~/{{ item }} loop: [.bashrc, .vimrc] ``` 3. **执行同步** ```bash ansible-playbook -i "目标IP," sync_env.yml -u 用户名 -K ``` --- ### 五、容器化方案(Docker) 1. **导出当前环境** ```bash docker commit 容器ID my_env_image docker save my_env_image > env.tar ``` 2. **在目标机器导入** ```bash docker load < env.tar docker run -it my_env_image ``` --- ### 注意事项 1. **敏感信息处理** - 使用`git-secret`或`.gitignore`排除密钥文件 - 环境变量存储在`~/.profile`并通过`source`加载 2. **差异化配置** - 在Git管理的配置文件中使用条件判断: ```bash # .bashrc 尾部添加 if [ "$(hostname)" = "laptop" ]; then alias suspend=&#39;systemctl suspend&#39; fi ``` 3. **验证恢复流程** - 建议在虚拟机中测试同步的完整恢复过程 --- 以上方案可组合使用,推荐组合:**Git代码同步 + apt-clone软件同步 + Ansible配置部署**,适合需要频繁同步多台设备的开发者。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

昕光xg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值