Docker踩过的坑
前言
主要是记录Docker遇到的坑,更多的是因为自己的粗心大意,以此警示
正文
Dockerfile里的RUN
某一次把启动服务的命令写在了 Dockerfile 中,后来发现服务一直拉不起来.
原来是把启动命令写在了 Dockerfile 的 RUN 里
Dockerfile 的 RUN 命令只有在打包时才会用到
Dockerfile 的 CMD 命令才是在镜像启动时执行,我们只需要将启动命令放在 CMD 里即可
但是为了分开 (Dockerfile 只负责打包,执行由 Docker-compose ),我个人一般将启动命令放在 Docker-compose 的 command 里
Docker 内部的服务不会更新
某一次写了服务, 发现该服务有一个问题,修复后重新 go build 用 Docker 重新制作并测试
使用 Docker-compose 进行测试(docker-compose up ),只有编译过后的二进制服务更新了, 其余没更新
发现代码在 Docker 里没有更新(通过比对 md5 )
Dockerfile 文件如下
# 基础系统镜像
FROM debian:stable-slim
# 新建文件夹
RUN mkdir /root/gophish
# 设置工作目录
WORKDIR /root/gophish
# COPY当前目录所有文件到WORKDIR
COPY . .
# 设置执行权限并执行
RUN chmod +x gophish
# 注意:RUN后面的命令只有在构建镜像时执行,CMD才是启动时执行,也可以将启动写到DockerCompose中方便管理
原因是在多次 build 时, 基础镜像 stable-slim 里有上一次编译的 gophish 二进制文件
也就是说, mkdir 并不会执行, WORKDIR也不会执行, 走到 COPY 时, Docker没有检测到二进制文件 gophish 更新了,
所以镜像内部的 gohish 一直是老得版本
解决问题有多种方法, 比如把原来的镜像删除/COPY时不要一次全部COPY指定文件夹依次COPY等等,我是直接修改Dockerfile
# 基础系统镜像
FROM debian:stable-slim
# 新建文件夹, 防止Docker识别不出文件改动,在COPY前先删除原有文件
RUN rm -rf /root/gophish/ && mkdir /root/gophish
# 设置工作目录
WORKDIR /root/gophish
# COPY当前目录所有文件到WORKDIR
COPY . .
# 设置执行权限并执行
RUN chmod +x gophish
# 注意:RUN后面的命令只有在构建镜像时执行,CMD才是启动时执行,也可以将启动写到DockerCompose中方便管理
COPY 的艺术
看到许多教程都建议 COPY . .
也就是将本地文件夹所有文件都 COPY 到 Docker 中
这种方式跟普通的一个文件夹一个文件夹的 COPY 相比, 虽然减少了几行命令, 但是也有其缺点
就是会将所有文件都 COPY 比如 .git 文件夹等不需要 COPY 的文件夹和文件
比如

Docker-compose up 时代码不会更新
如果在 docker-compose 中有
image: xxx:1.0
build: .
这代表image不存在时才会 build
如果存在老的版本你改动了代码也不会重新build
解决方法是删除 xxx 的image 或者运行 docker-compose build
Docker踩过的坑的更多相关文章
- Win7 安装 Docker 踩的那些坑
公司电脑是 WIN7 x64 旗舰版 SP1,安装 Docker 时踩了好多雷,分享出来给大家排排雷. 首先,Docker Desktop Installer 的 Windows 版只支持 Win10 ...
- windows虚拟机下 安装docker 踩过的坑
首先,你的是win7.8还是win10 windows对docker兼容也是最近的事,所以win7.8的话,安装docker是要用工具箱的,不过官方给了下载. 国内话的可以通过,阿里镜像,或者清华镜像 ...
- 使用docker踩过的坑(二)
关于docker的部署,我这里不多说了 下面写一些最近经常用到的命令: docker下载镜像: docker pull 镜像名 docker查看已下载的所有镜像: docker images dock ...
- 使用docker踩过的坑
最近需要使用docker,但是win10电脑的系统不是docker windows适用版本,没法在windows上安装 于是就上centos虚拟机里面装了一个docker docker pull文件的 ...
- docker部署redis及踩到的坑
对docker很好奇,玩了一下,部署了一个redis,结果踩了很多坑 任务目的就是在docker中成功部署redis并保证数据持久化到本地,配置也使用本地配置 docker run -p : -v $ ...
- ubuntu 下安装docker 踩坑记录
ubuntu 下安装docker 踩坑记录 # Setp : 移除旧版本Docker sudo apt-get remove docker docker-engine docker.io # Step ...
- ASP.NET Web 应用 Docker踩坑历程——续
ASP.NET Web 应用 Docker踩坑历程发表后,也开始使用Docker了,然而发布的过程比较痛苦,经常发生下图的事情: 据说是nuget包还原时发生错误 百度了半天也找不到解决的方法,而发生 ...
- ASP.NET Web 应用 Docker踩坑历程
听说Docker这玩意挺长时间了,新建Web应用的时候,也注意到有个启用Docker的选项. 前两天扫了一眼<[大话云原生]煮饺子与docker.kubernetes之间的关系>,觉得有点 ...
- 可视化爬虫Portia安装和部署踩过的坑
背景 Scrapy爬虫的确是好使好用,去过scrapinghub的官网浏览一下,更是赞叹可视化爬虫的犀利.scrapinghub有一系列的产品,开源了大部分项目,Portia负责可视化爬虫的编辑,Sp ...
随机推荐
- 实验楼表关系建立 (课程模块·5张表)
实验楼表关系图 from utils.MyBaseModel import Base from django.db import models # # Create your models here. ...
- mysqldump: [ERROR] unknown variable 'database=test'.
背景: 导出数据库test库的test表数据出现报错信息:mysqldump: [ERROR] unknown variable 'database=test'. 原来是my.cnf参数文件配置了以下 ...
- jmeter跨线程使用token
项目的接口测试,今早所有接口都不通了,查看原因是登录接口地址变了..... 原来的方式是每个线程中都写了登陆接口来获取token,但是因为登陆接口地址改变的原因,要改好多个登陆接口,所以就想把toke ...
- AWT08-绘图
1.组件绘图原理 Java GUI能展示出不同对话框.窗口等等组件外观的本质其实就是绘图. 在AWT中,真正提供绘图功能的是Graphics对象,在Component中提供了三个方法来完成组件图形的绘 ...
- 第二篇:docker 简单入门(二)
本篇目录 写在最前面的话 最常用的docker命令 获取远程仓库镜像 写在最前面的话 如上图大家看到的这样,以后此类文章请到其他平台查阅,由于博客园提示说,内容太多简单,所以以后简单的内容我会放在cs ...
- spark streaming 消费 kafka入门采坑解决过程
kafka 服务相关的命令 # 开启kafka的服务器bin/kafka-server-start.sh -daemon config/server.properties &# 创建topic ...
- DRF类视图让你的代码DRY起来
刚开始写views.py模块的代码,一般都是用def定义的函数视图,不过DRF更推荐使用class定义的类视图,这能让我们的代码更符合DRY(Don't Repeat Yourself)设计原则: 使 ...
- 多任务-python实现-迭代器相关(2.1.12)
@ 目录 1.需求 2.斐波那契数列演示 3.并不是只有for循环能接收可迭代数据类型,list,tuple也可以 1.需求 类比 早上起来吃包子 1.买1年的包子,放在冰箱,每天拿一个 2.每天下楼 ...
- ASP.NET Core WebAPI实现本地化多语言(单资源文件)
在Startup ConfigureServices 注册本地化所需要的服务AddLocalization和 Configure<RequestLocalizationOptions> p ...
- ASP.NET Core 3.1 IOC容器以及默认DI以及替换Autofac生命周期
IOC 就是我们需要一个对象 以前我们是去 new 现在我们是直接向 IOC容器 要我们需要的那个对象. 使用一个IOC容器(autofac)通过依赖注入控制各个组件的耦合.也就是说你写好了组件,不需 ...