构建自定义镜像时可以设置镜像名称,如下所示:
docker build -t dude/man:v2 . # Will be named dude/man:v2
有没有办法在Dockerfile中定义镜像的名称,这样我就不用在
docker build
命令中提到了?
如何在不使用 yml 文件的情况下构建具有自定义名称的图像:
docker build -t image_name .
如何使用自定义名称运行容器:
docker run -d --name container_name image_name
Dockerfile 中不支持图像标记。这需要在您的构建命令中完成。作为解决方法,您可以使用标识目标图像名称的 docker-compose.yml 进行构建,然后运行
docker-compose build
。示例 docker-compose.yml 看起来像
version: '2'
services:
man:
build: .
image: dude/man:v2
就是说,有人反对使用 compose 进行构建,因为这不适用于群模式部署。所以你回到运行你在问题中给出的命令:
docker build -t dude/man:v2 .
就个人而言,我倾向于在我的文件夹 (build.sh) 中使用一个小的 shell 脚本进行构建,该脚本传递任何参数并在其中包含图像名称以节省输入。对于生产,构建由 ci/cd 服务器处理,该服务器在管道脚本中具有图像名称。
如果您必须引用特定的 docker 文件,这是另一个版本:
version: "3"
services:
nginx:
container_name: nginx
build:
context: ../..
dockerfile: ./docker/nginx/Dockerfile
image: my_nginx:latest
然后你就跑
docker-compose build
我的
Dockerfile
单独的解决方案是添加一个 shebang 行:
#!/usr/bin/env -S docker build . --tag=dude/man:v2 --network=host --file
FROM ubuntu:22.04
# ...
然后
chmod +x Dockerfile
和./Dockerfile
就要走了。
我什至添加了更多 docker build
命令行参数,例如指定主机网络。
注意:具有
env
支持的 -S/--split-string
仅适用于较新的 coreutils 版本。
使用特定的 Dockerfile,您可以尝试:
docker build --tag <Docker Image name> --file <specific Dockerfile> .
docker build --tag second --file Dockerfile_Second .
通常在 Docker 中你不能像
Dockerfile
那样说你想要图像被标记什么。所以你要做的是
Dockerfile
Makefile
.PHONY: all
all: docker build -t image_name .
make
而不是直接调用docker build
buildah
但这里有一个更好的主意……不要用 Docker 构建镜像!而是使用
buildah
来构建它们,这是 podman 工作人员提供的新构建工具,它使用 shell(或任何语言),允许轻松地在云中构建(无需使用像 kaniko
这样的不同项目),并允许无根构建图像!在构建脚本的末尾,只需使用 buildah commit
将图像保存在里面。这是它的样子。
#!/bin/sh
# Create a new offline container from the `alpine:3` image, return the id.
ctr=$(buildah from "alpine:3")
# Create a new mount, return the path on the host.
mnt=$(buildah mount "$ctr")
# Copy files to the mount
cp -Rv files/* "$mnt/"
# Do some things or whatever
buildah config --author "Evan Carroll" --env "FOO=bar" -- "$ctr"
# Run a script inside the container
buildah run "$ctr" -- /bin/sh <<EOF
echo "This is just a regular shell script"
echo "Do all the things."
EOF
# Another one, same layer though
buildah run "$ctr" -- /bin/sh <<EOF
echo "Another one!"
echo "No excess layers created as with RUN."
EOF
# Commit this container as "myImageName"
buildah commit -- "$ctr" "myImageName"
现在您不必用
Makefile
四处乱砍。你有一个 shell 脚本可以做所有事情,而且比 Dockerfile
. 强大得多
旁注,
buildah
也可以从 Dockerfile
s 构建(使用 buildah bud
),但这个缺点是 Dockerfile
。所以这无济于事。