Skip to main content

Command Palette

Search for a command to run...

一些使用docker的tips

Updated
2 min read

作为docker重度使用者,有时也会犯一些低级错误,记录一下长期使用下来的一些经验,长期更新

ADD or COPY

不只一位同事问过我这个问题:在Dockerfile里面看到了下面这一句,但是进入容器之后,在/tmp目录并没有发现buildkit-v0.12.3.darwin-amd64.tar.gz,只看到了解压后的`bin`文件夹,为何没看到解压呢?

ADD buildkit-v0.12.3.darwin-amd64.tar.gz /tmp
# ls /tmp
# bin

这是因为在Dockerfile里面,ADD不仅有COPY字面上的意义,还可以

  • 下载网络资源

  • 解压文件

不要需要注意的,下载和解压这两件事是或的关系,也就是说

ADD https://xxx.tar.gz .

RUN curl -O https://xxx.tar.gz

的效果是一致的。(ps: 千万不要期望`ADD https://xxx.tar.gz .` 既能下载又帮你解压)

COPY/ADD文件/文件夹

当你想要在Dockerfile上COPY文件夹的时候

FROM busybox:1.35.0-glibc
COPY bin /tmp
# ls /tmp
# buildctl

但其它我想要复制的整个文件夹,而不仅仅是将文件夹里面的内容复制到/tmp文件夹下,

FROM busybox:1.35.0-glibc
COPY bin /tmp/bin
# ls /tmp
# bin

之前踩到这个坑,因为会不自觉地把COPY当`mv`命令来用

heredocs

我是在推上看到这个的,果然要与时俱进哇

RUN apt-get update -y \
    && apt-get install -y --no-install-recommends curl libsasl2-2 gsasl libnss-ldapd libssl-dev netcat-traditional procps krb5-user locales \
    && rm -rf  /var/lib/apt/lists/*

虽然我不是一个强迫症患者,但我也是爱整洁的,所以更喜欢下面这种写法

RUN <<EOF
apt-get update -y 
apt-get install -y --no-install-recommends curl libsasl2-2 gsasl libnss-ldapd libssl-dev netcat-traditional procps krb5-user locales 
rm -rf  /var/lib/apt/lists/*
EOF

值得注意的是,因为你使用`docker buildx build`而不是docker build, 则需要在Dockerfile的第一行加上以下语句:

# syntax=docker/dockerfile:1

ARG

将ARG赋值给ENV

就在前两天我被自己坑了

ARG MY_ARG
FROM busybox:1.35.0-glibc
ENV MY_ENV=$MY_ARG

`docker build --build-arg MY_ARG=test -t argtest .`

docker run --rm -it argtest env |grep MY_ENV                
MY_ENV=

我第一反应是:竟然是空的,这不对呀,就很奇怪

FROM busybox:1.35.0-glibc
ARG MY_ARG
ENV MY_ENV=$MY_ARG

原来需要调整下ARG的位置

docker run --rm -it argtest env |grep MY_ENV                
MY_ENV=test

只是,没有找到为何这样做以及出处

多阶段构建传递ARG

ARG MY_ARG
FROM busybox:1.35.0-glibc

FROM alpine:3.18
ENV MY_ENV=$MY_ARG

没有意外,MY_ENV是空的

若要将MY_ARG传到alpine:3.18那一层,显示声明MY_ARG即可

ARG MY_ARG
FROM busybox:1.35.0-glibc

FROM alpine:3.18
ARG MY_ARG
ENV MY_ENV=$MY_ARG

多架构镜像的构建

其实,若不是要支持所谓的“信创”,平时工作中也没机会构建ARM镜像的,但既然有这个机会,借此契机,自然也折腾了一番,除了docker官网,我主要参考了这篇文章Multi-Architecture Docker Images

唯一需要补充的是关于配置方面,如果你使用的是一个私有的harbor镜像仓库(eg: 私有镜像仓库是:172.16.2.130),需要在buildkit的配置文件中添加以下配置

# /etc/buildkitd.toml
debug = true
[registry."172.16.2.130"]
  http = true
  insecure = true

还是来上一个实际的使用案例吧

FROM busybox:1.35.0-glibc
CMD ["uname", "-i"]

构建amd64和arm64镜像,并推送到私有harbor镜像仓库

docker buildx build --platform linux/amd64,linux/arm64 \
    -t 172.16.2.130/capops/multiarch:v0.0.1 . --push

使用这种方法的好处的: 同一份Dockerfile,构建出来的不同架构的镜像,共用同一个镜像tag,例如以上命令,在amd64的机器上执行docker pull 172.16.2.130/capops/multiarch:v0.0.1 获取的是amd64格式的镜像,如下所示

$ docker inspect --format='{{.Os}}/{{.Architecture}}' 172.16.2.130/capops/multiarch:v0.0.1
linux/amd64

而在arm64的机器上执行docker pull 172.16.2.130/capops/multiarch:v0.0.1 获取的是arm64格式的镜像,应用层无需要做任何变动。

参考:

49 views

More from this blog

2025: 祛魅 灰度 念头通达

今天是2025年的最后一天,当大家都在准备下班的时候,好巧不巧的,我刚好发现了一个不大不小的问题,大胆猜想,小心求证,向上反馈,暴露风险,作为2025年工作注解,实在是再有趣不过了。 今年的工作,从结果上看,还算平稳,至于过程,有太多不可言说的部分。厂里打镙丝的牛马,有工资可拿,理应知足了,至于其它的,与己无关,也没那么重要了。 祛魅 近距离观察大厂,才发现一些违背常识/直觉的事实:路人以为的高大

Feb 28, 20261 min read21

大厂祛魅:破碎的专注力

毁掉一个人最直接的方法,就是毁掉ta的专注力。 这句话的出处已然模糊,但放在大厂环境中,却显得格外深刻。 围城 大厂宛如一座围城。城外的人满怀憧憬,目之所及皆是光鲜;城内的人却如困笼之鸟,翅膀日渐退化,每日挣扎求生。 高大上 不可否认,大厂的硬件设施确实令人艳羡:宽敞的独立园区内,来往穿梭的人群中,几乎人人手握智能设备。这看似现代化的景象背后,却藏着一个无奈的事实:在工作时段,每台电脑都被严密监控,连听音乐都成奢望。于是,工作之余玩手机,成了许多人难得的解压方式。 大厂的品牌效应确实强大。外界对...

Jul 29, 20251 min read138

Black Swan

黑天鹅理论 是指极不可能发生,实际上却又发生的事件 来到大厂打工已经满一个月了,从一开始的手足无措,到逐渐度过不适期,也算是适应了吧。 不适应 刚入职时,不适应的地方还是挺多的。 第一次只使用台式机工作,这就限制了我一天中的绝大部分时间,都必须呆在自己的工位上,好在工位足够大。只是人与人的沟通少了很多,有问题只能在工位上通过 IM 呼对方,有种魔幻又现实的感觉 第一次只能用 Windows,也不能 WSL,这给我的工作效率带来了很大影响,不能用熟悉的软件,就连写代码用的 VSCode 的...

Jan 24, 20251 min read74

2024年: 逐渐平静

这个世界是一面镜子,会把你的感受反射给你 2024 开端: 相由心生 那时,还带着一着愤懑,因为拿到了低绩效,虽然内心知道这是公司经营困难,想让我离开的一种策略,但仍然感受到自己那可笑的自尊受到了践踏。自那之后,非必要不加班,只做份内事,尽可能地不去涉及份外之事。 2024 年中: 与人为善 组里的项目眼见不行了,我被迫去支援 AI 项目,久违地写起了 python,项目接近完成时,意外收到通知:我拿到大礼包了。在这之前,架构师因故裸辞。在我离开之后不到两周,我的 TL 也裸辞了,直到同事告诉...

Jan 9, 20251 min read92

企业软件之殇

殇 动词 未成年而死。 名词 战死者。 笔者经历了两家打着云原生旗号的企业软件/解决方案公司,都是中途加入,项目都以解(失)散(败)告终。 云原生解决方案 NB 公司:一个传统的 IDC 小厂,想着借云原生的热度,进军企业软件市场。 在加入这个项目之前,笔者考取了 CKAD 认证,彼时对 K8s 相当着迷。先简要介绍一下这个项目背景: 基于 Rancher (换皮肤)的二次开发项目,名字叫:HCaaS ,在笔者加入这个团队之前,项目已经开发近两年了,除了 TL 之外,其它人之前都...

Jul 1, 20241 min read103

just for fun

57 posts

I'm a Software Engineer