如何在Dockerfile中设置镜像名称?

问题描述 投票:0回答:6

构建自定义镜像时可以设置镜像名称,如下所示:

docker build -t dude/man:v2 . # Will be named dude/man:v2

有没有办法在Dockerfile中定义镜像的名称,这样我就不用在

docker build
命令中提到了?

docker tags dockerfile
6个回答
503
投票

如何在不使用 yml 文件的情况下构建具有自定义名称的图像:

docker build -t image_name .

如何使用自定义名称运行容器:

docker run -d --name container_name image_name

496
投票

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 服务器处理,该服务器在管道脚本中具有图像名称。


82
投票

如果您必须引用特定的 docker 文件,这是另一个版本:

version: "3"
services:
  nginx:
    container_name: nginx
    build:
      context: ../..
      dockerfile: ./docker/nginx/Dockerfile
    image: my_nginx:latest

然后你就跑

docker-compose build

6
投票

我的

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 版本。


3
投票

使用特定的 Dockerfile,您可以尝试:

docker build --tag <Docker Image name> --file <specific Dockerfile> .

例如
docker build --tag second --file Dockerfile_Second .


0
投票

使用 Docker 的解决方法

通常在 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
。所以这无济于事。

© www.soinside.com 2019 - 2024. All rights reserved.