Docker:使用 docker-compose 复制文件和目录

Mat*_*Mat 8 docker docker-compose

我为自定义应用程序创建了一个 Docker 映像,该应用程序需要一些许可证文件(一些文件和一个目录)才能运行,因此我使用 COPY 命令Dockerfile将许可证文件复制到映像:

# Base image: Application installed on Debian 10 but unlicensed
FROM me/application-unlicensed

# Copy license files
COPY *.license /opt/application/
COPY application-license-dir /var/lib/application-license-dir
Run Code Online (Sandbox Code Playgroud)

我使用它Dockerfile来构建一个具有单个容器许可证的新映像。因为我有 5 个不同的许可证,所以我创建了 5 个不同的图像,每个图像都有一个特定的许可证文件和目录。

许可证也固定到MAC 地址,因此当我运行五个容器之一时,我使用--mac-address参数指定自己的 MAC 地址:

docker run --rm --mac-address AB:CD:EF:12:34:56 me/application-license1
Run Code Online (Sandbox Code Playgroud)

这项工作,但我希望有一个更好更聪明的方法来管理这个:

docker-compose是否可以指定容器 MAC 地址一样,当我使用docker-compose.


编辑:让我更好地解释许可证文件的结构

应用程序部署到/opt/applicationDocker 镜像的目录中。

许可证文件 ( *.license)/opt/application位于应用程序本身的同一级别,除非我创建一些符号链接,否则它们无法保存到 Docker 卷中(但我必须检查应用程序是否能以这种方式工作)。

目录 application-license-dir 需要在/var/lib/application-license-dir,因此它可以安装到 Docker 卷中(我必须检查应用程序是否可以工作,但我认为可以)。

这两个*.license文件和文件到application-license-dir是二进制的,所以我不能脚本或在运行时创建它们。

所以:

  1. 可以docker-compose结合并将其安装在一个码头工人卷之前创建多克尔主机服务器上的本地目录?
  2. 可以docker-compose将我的许可证文件和许可证目录从 GIT 存储库(本地克隆)复制到步骤 1 中创建的本地目录吗?
  3. 可以为存储在卷中的文件docker-compose创建一些符号链接到容器/opt/application目录中*.license吗?

Dav*_*aze 7

对于每次运行容器或在不同系统上运行容器时不同的事情,您通常不希望在 Dockerfile 中指定这些内容。这包括您上面显示的许可证文件;用户 ID 等内容也符合此模式;根据您的配置文件的固定程度,它们也可以计数。(对于每次运行容器时都相同的内容,您确实希望将它们包含在映像中;尤其是应用程序源代码。)

您可以使用 Docker绑定安装在运行时将文件注入到容器中。使用该指令可以使用 Compose 语法进行绑定安装volumes:

这将为您提供一个大致如下的 Compose 文件:

version: '3'
services:
  app1:
    image: me/application-unlicensed
    volumes:
      - './app1.license:/opt/application/app.license'
      - './application-license-dir:/var/lib/application-license-dir'
    mac_address: 'AB:CD:EF:12:34:56'
Run Code Online (Sandbox Code Playgroud)

像这样的绑定挂载非常适合将配置文件推送到容器中。它们可以提供一个空的主机目录,可以将日志文件写入其中,但不是从映像中复制数据的机制。如果您的应用程序无法将其所有状态存储在外部数据库中,那么它们还可以用作存储需要比容器寿命更长的数据的地方。

  • 是的,它可以。如果您仔细查看该行,我打算将特定于容器的“app1.license”文件安装到容器中的固定“/opt/application”目录中,因此您可以重复此操作(使用不同的文件)每个容器。 (2认同)