更改docker容器中的时间而不影响宿主机

本文介绍如何在Docker容器中修改时间而不影响宿主机及其他容器。提供了使用--cap-addSYS_TIME命令及faketime工具的具体步骤。

容器的时间问题:

如果想要直接进入容器,使用date -s修改日期,则会出现一个date: cannot set date: Operation not permitted的错误,而且也不会成功。

这是由于docker容器的隔离是基于Linux的Capability机制实现的, Linux的Capability机制允许你将超级用户相关的高级权限划分成为不同的小单元。目前Docker容器默认只用到了以下的Capability

而要修改系统时间需要有SYS_TIME权限。使用 --cap-add, --cap-drop 可以添加或禁用特定的权限。–privileged参数也可以达到开放权限的作用, 与–cap-add的区别就是, --privileged是将所有权限给容器

docker使用--privileged, --cap-add, --cap-drop 来对容器本身的能力进行开放或限制。

那么使用如下命令就可以直接改变时间了:

docker run -it --cap-add SYS_TIME --name centos centos /bin/bash

接着进入容器实行date命令修改时间,如果没有修改成功,,那么可能就是因为宿主机做了共享主机的localtime(比如laradock就做了):

docker run --name <name> -v /etc/localtime:/etc/localtime:ro  .... 
docker cp /etc/localtime:【容器ID或者NAME】/etc/localtime

如果修改成功一会就又恢复了,那么就可能要查看一下宿主机是否做了定时校准的任务。

但是如此执行之后,那就是容器时间变更为5月28日之后,宿主机的时间也跟着变更了, 因为上边操作的 --cap-add SYS_TIME是为了将宿主机的内核时间挂载进来与容器共享,因此容器时间更改了,宿主机时间也会跟着更改。

1、场景

使用docker部署了一个后端服务,测试需要改系统时间,如果直接改宿主机时间则会影响到其他的docker(不管是在宿主机上改还是通过–cap-add SYS_TIME参数在docker中修改)。有没有什么既能满足测试要求又不影响其他docker的方法呢?答案就是通过faketime来欺骗docker,达到此目的。

2、安装faketime

github地址:https://github.com/wolfcw/libfaketime

# 安装git
yum -y install git

# 下载faketime源码
git clone https://github.com/wolfcw/libfaketime
# 进入libfaketime文件夹下
cd libfaketime
# 编译源码
make
make install

安装完成后,在/usr/local/lib/下有个kaketime的目录

3、使用

3.1 比如想修改时间为2020-05-01 00:01:00,执行如下命令
export LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1 FAKETIME="2020-05-01 00:01:00";

注意:

  • 1、如果想要修改docker容器内服务的时间,执行此命令后,将需要重启服务才能生效时间
  • 2、时间格式需要正确,否则无法生效
  • 3、docker容器重启后,faketime修改无效
  • 4、此方法修改后的时间将持续保持,即容器时间一致都是设置的时间
3.2 比如想修改时间为5天后,执行如下命令
export LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1 FAKETIME="-5d"

注意:

  • 1、如果想要修改docker容器内服务的时间,执行此命令后,将需要重启服务才能生效时间
  • 2、5天前(-5d) 5天后(+5d)
  • 3、此方法修改后的时间可变化
3.3 若想要恢复,直接把环境变量修改为空即可
export LD_PRELOAD=
<think> 嗯,用户的问题是如何将docker容器中的sql文件复制到宿主机。从引用内容看,用户提供了多个相关引用片段,其中引用[1]和[2]讲的是从宿主机复制文件到容器,而引用[3]正好详细说明了容器文件复制到宿主机的操作。 仔细梳理引用[3]的关键信息:其中明确给出了命令格式"docker cp bf4c4fff338c:/root/rest.sql /root/",这个示例完整展示了从容器复制文件到宿主机的过程。这里bf4c4fff338c是容器ID,/root/rest.sql是容器内文件路径,/root/是宿主机目标目录。 用户可能是个正在处理数据库迁移的开发或运维人员,从引用[3]描述的"接手老项目"背景推测,用户可能面临紧急的数据迁移需求,语气中透露出需要明确指导的急切。ta特意强调"是导入而是复制到宿主机",说明已区分清楚方向性问题。 需要特别注意操作权限问题,引用[3]提到目标目录/root/需要sudo权限,这点必须提醒用户。另外补充两个实用建议:一是推荐使用docker ps获取准确容器ID,二是强调路径必须使用绝对路径——这两个细节在操作中容易出错。 考虑到用户后续可能还需要操作数据库,准备附带两个相关问题:导出整个数据库更规范的方式(mysqldump命令),以及如何连接容器数据库维护数据完整性。最后检查命令格式确认无误:容器ID在前,宿主机路径在后,与用户需求方向完全一致。 </think> 要将 Docker 容器中的 SQL 文件复制到宿主机,请按照以下步骤操作(基于引用[3]的示范): ### 操作步骤 1. **查看容器ID** 在宿主机终端执行: ```bash docker ps ``` 找到目标容器的 `CONTAINER ID`(例如 `bf4c4fff338c`)。 2. **执行复制命令** 使用格式: ```bash docker cp <容器ID>:<容器内文件路径> <宿主机目标路径> ``` **示例**(将容器内 `/root/rest.sql` 复制到宿主机的 `/root/` 目录): ```bash docker cp bf4c4fff338c:/root/rest.sql /root/ ``` ✅ 成功时会显示文件传输进度(如 `Successfully copied 19.5kB`)。 --- ### 关键参数说明 | 参数 | 说明 | |--------------------|----------------------------------------------------------------------| | `<容器ID>` | 通过 `docker ps` 获取的容器唯一标识(如 `bf4c4fff338c`) | | `<容器内文件路径>` | **必须为绝对路径**(如 `/tmp/mydb.sql` 或 `/root/backup.sql`) | | `<宿主机目标路径>` | 宿主机目录(如 `/home/user/`),需确保当前用户有写入权限 | > ⚠️ **注意** > - 若目标路径是系统目录(如 `/root/`),需使用 `sudo` 执行命令 > - 文件名需包含扩展名(如 `.sql`) --- ### 典型应用场景 1. **数据库备份迁移** 容器中生成的 SQL 备份需导出到宿主机持久化存储[^3]。 2. **配置文件修改** 将容器内修改后的配置复制到宿主机存档,便于重建容器时复用。 3. **日志分析** 导出容器内的 SQL 操作日志进行离线分析[^3]。 --- ### 相关问题 1. 如何将宿主机的文件复制到 Docker 容器内? 2. Docker 容器中的 MySQL 如何直接连接宿主机的数据库服务?[^4] 3. 除了 `docker cp`,还有哪些方法可以在容器宿主机间共享文件? 4. 如何导出整个 Docker 容器内的 MySQL 数据库而非单个 SQL 文件? 5. 容器内执行 `source` 命令导入 SQL 文件失败时如何排查?[^2] > 引用说明:本文操作基于 Docker 官方文件拷贝协议实现,具体命令规范详见 [Docker CLI 文档](https://docs.docker.com/engine/reference/commandline/cp/)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

杰哥的技术杂货铺

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

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

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

打赏作者

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

抵扣说明:

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

余额充值