我尝试构建一个包含外部文件的 docker 容器

问题描述

我尝试创建一个带有 bind9 的 docker 容器,我想添加我的 db.personal-domain.com 文件,但是当我运行 docker build 然后 docker run -tdp 53:53 -v config:/etc/bind <image id> 容器没有我的 db.personal-domain.com 文件。如何解决?谢谢!

树结构

-DNS
--Dockerfile
--config
---db.personal-domain.com

Dockerfile

FROM ubuntu:20.04

RUN apt-get update
RUN apt-get install -y bind9
RUN apt-get install -y bind9utils

workdir /etc/bind
VOLUME ["/etc/bind"]

copY config/db.personal-domain.com /etc/bind/db.personal-domain.com


EXPOSE 53/tcp

CMD ["/usr/sbin/named","-g","-c","/etc/bind/named.conf","-u","bind"]

解决方法

-v config:/etc/bind

该语法创建了一个名为 config 的命名卷。看起来您想要一个指向当前目录中路径的主机卷,为此您需要包含一个带前导斜杠的完全限定路径,例如使用 $(pwd) 生成路径:

-v "$(pwd)/config:/etc/bind"
,

您的 docker run -v 选项存在语法问题。如果您使用 docker run -v name:/container/path(即使 name 匹配本地文件或目录),它也会在您的配置目录上挂载 named volume。您需要主机内容,并且需要 -v /absolute/host/path:/container/path 语法(主机路径必须以 / 开头)。所以(在 ​​Linux/MacOS 上):

docker run -d -p 53:53 \
  -v "$PWD:config:/etc/bind" \
  my/bind-image

在您的图像中,您尝试在配置文件中 COPY。这也可以;但它被卷挂载隐藏,也被 VOLUME 语句变得无效。 (VOLUME 最明显的作用是防止对命名目录进行后续更改;以后不需要挂载卷。)

如果您从 Dockerfile 中删除 VOLUME 行,它也应该可以在完全没有 -v 选项的情况下运行容器。 (但如果您在不同的设置中有不同的 DNS 配置,这可能不是您想要的。)