Docker Tips
无法访问 Docker Hub(被墙了)
很遗憾,被墙了,2023年6月开始无法访问。
最简单的解决方法是科学上网。
删除所有无用镜像
docker image prune --all --force
添加 --all 命令会提示删除所有没有用到(小于1个容器)的镜像, 可以放心删,因为我们启动容器前有个好习惯 docker pull。
WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N]
能大幅减少存储空间的占用,特别是服务器资源吃紧时能缓解燃眉之急。
...
deleted: sha256:da68989491bef192fa61a6c4a1864254171f48d96d53ac51782563b49d50057b
Total reclaimed space: 2.844GB
容器内通过 ip 访问宿主机
首先是通过 docker0 这个网络,找出可访问宿主机的 ip。 为了尽量清晰,命令比较长,有优化的空间:
ifconfig docker0 | grep --only-matching --extended-regexp "\<inet[[:space:]].*[[:space:]][[:space:]]netmask\>" | grep --only-matching --extended-regexp "[0-9]{1,}.[0-9]{1,}.[0-9]{1,}.[0-9]{1,}"
执行结果如下:
root@SERVER:/tmp# ifconfig docker0 | grep --only-matching --extended-regexp "\<inet[[:space:]].*[[:space:]][[:space:]]netmask\>" | grep --only-matching --extended-regexp "[0-9]{1,}.[0-9]{1,}.[0-9]{1,}.[0-9]{1,}"
172.17.0.1
启动容器时用 --env-file .env 从文件读取并传递环境变量
持续集成流水线中可以设置一个名叫 PROD_ENV_FILE 的 File 类型的 CI 变量。
注意如果 $PROD_ENV_FILE 里面有引用其它受保护的 CI 变量时,无法直接通过 --env-file $PROD_ENV_FILE 传给容器。
例如,$PROD_ENV_FILE 里的内容是 PASSWORD=$CI_SECRECT 最终传给容器的是 PASSWORD='[MASKED]',显然不对。还要注意字符串的受保护变量,在输出时会自动在加两边加引号,所以若有 PASSWORD='$CI_SECRECT' 最终会变成 PASSWORD=''变量值'',显然是不符合预期的。
必须先打印成文件 cp $PROD_ENV_FILE .env 然后再 --env-file .env。
记得最后要 rm .env,因为这个文件是保存在容器外 docker 所在的宿主机的。
注意 --network host 模式下不支持 --network-alias 所以容器命名 --name 很重要
-p 主机端口:容器内端口
注意第一个是指主机端口。
若有多个端口需要映射,可以重复多次使用该选项。例如 -p 8080:80 -p 8090:8001。
--volume 主机绝对路径:容器内绝对路径
注意要用绝对路径。
不打包重要文件至镜像中
以下命令,相当于只在执行 npm ci 时将重要文件临时映射进去使用。
# Download dependencies as a separate step to take advantage of Docker's caching.
# Leverage a cache mount to /root/.npm to speed up subsequent builds.
# Leverage a bind mounts to package.json and package-lock.json to avoid having to copy them into
# into this layer.
RUN --mount=type=bind,source=package.json,target=package.json \
--mount=type=bind,source=package-lock.json,target=package-lock.json \
--mount=type=cache,target=/root/.npm \
npm ci --omit=dev