专栏首页运维录如何拷贝Docker容器内的文件?

如何拷贝Docker容器内的文件?

开始之前

某个项目容器需要添加 wkhtmltopdf 软件包用于处理html与pdf文件转换,由于默认的apt源服务器在国外,使用apt 安装 wkhtmltopdf 时下载速度只有感人的几kb/s。

我们需要更换一个国内的apt镜像地址,例如使用 阿里云、网易云、等开源镜像站。debain 或 ubuntu 系统 apt 仓库配置保存在 /etc/apt/sources.list 配置文件中,我们可以替换容器中的这个文件。

环境描述

容器镜像: php:5.6-fpm
容器系统: debian 8 (jessie)
配置文件: /etc/apt/sources.list
Docker主机: Ubuntu Server 16.04

举个栗子

1. 创建 sources.list文件,内容如下:

cat sources.list

deb http://mirrors.aliyun.com/debian/ jessie main non-free contrib
deb http://mirrors.aliyun.com/debian/ jessie-proposed-updates main non-free contrib
deb-src http://mirrors.aliyun.com/debian/ jessie main non-free contrib
deb-src http://mirrors.aliyun.com/debian/ jessie-proposed-updates main non-free contrib

2. 备份容器内的文件

docker cp crm-test:/etc/apt/sources.list /tmp/sources.list.bak

这个条命令将把容器内的 sources.list文件,拷贝到宿主机上的 /tmp/目录

3. 替换容器内的 sources.list文件

docker cp sources.list crm-test:/etc/apt/sources.list

相反这个条命令将把宿主机上的文件拷贝到容器

4. 验证

docker exec -ti crm-test apt-get update
Ign http://mirrors.aliyun.com jessie InRelease
省略...
Fetched 22.0 MB in 19s (1120 kB/s)
Reading package lists... Done

5. 扩展 Dockerfile

每次都要为容器添加 sources.list文件实在是麻烦我们可以优化一下,把这个步骤定义在 Dockerfile 中例如:

head -n7 base/5.6/Dockerfile
# php-fpm:5.6

FROM php:5.6-fpm
MAINTAINER dongnan

# apt
COPY conf/sources.list /etc/apt/sources.list

命令帮助

docker cp --help

Usage:  docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
    docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

Copy files/folders between a container and the local filesystem

Options:
  -a, --archive       Archive mode (copy all uid/gid information)
  -L, --follow-link   Always follow symbol link in SRC_PATH

小结

最后来总结下文章中的知识点

  • docker cp子命令可以用来在容器与宿主机之间拷贝文件。
  • 拷贝文件时没有提示会直接替换目的文件,请提前做好备份工作。
  • 每次重复添加 sources.list文件很麻烦,更优的方式是在自定义docker镜像添加 sources.list 文件。

本文分享自微信公众号 - 运维录(gh_70d95b8f5f7c),作者:东南

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • mysqlnd 是什么?

    mysqlnd (MySQL native driver) MySQL原生驱动,是由 PHP 提供的连接 mysql数据库的驱动程序,用于代替 libmysql...

    用户1560186
  • 如何获得Docker容器进程ID?

    在某些情况下,比如系统负载很高 docker stop 无法关闭某个容器(无响应),这时可以根据容器进程的ID找到宿主机进程ID,然后强制kill掉这个容器,最...

    用户1560186
  • ​创建一个Docker 容器

    之前公众号发布了三篇关于Docker镜像与仓库的文章,如果需要阅读可以在微信公众号后台回复 镜像 获得文章链接,接下来让我们创建第一个容器。

    用户1560186
  • Java开发者容易犯的十个错误

    七月半夏
  • Java开发者容易犯的十个错误

    Arrays.asList()将返回一个数组内部是私有静态类的ArrayList,这不是java.util.ArrayList类,java.util.Array...

    三哥
  • 惊呆了!Java程序员最常犯的错竟然是这10个

    和绝大多数的程序员一样,我也非常的宅。周末最奢侈的享受就是逛一逛技术型网站,比如说 programcreek,这个小网站上有一些非常有意思的主题。比如说:Jav...

    沉默王二
  • 基于FPGA数字混频器的设计

    混频即两个不同频率之间的混合,得到第三个频率。数字混频器的设计也是FPGA数字信号处理中基础入门的设计之一,混频便是两个信号相乘得它们的和频率和差频率。数字混频...

    FPGA开源工作室
  • django源码分析 python ma

    如何分析django源码,笔者选择从django项目的启动方式开始 python manage.py runserver,本文主要分析了django项目的启动流...

    用户2398817
  • 实例解析Docker数据卷+数据卷容器+flocker数据共享+DockerHub操作

    Docker内部数据管理和Docker之间的数据共享为数据卷和数据卷容器,实例解析1.将本地的文件作为容器的数据卷,2.数据卷flocker插件实现容器集群(或...

    王小雷
  • 为什么谷歌、Facebook的AI研究员都坐在CEO身边?

    大数据文摘

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动