我为一个自定义应用程序创建了一个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
我用它Dockerfile
为单个容器的许可证构建新映像。由于我有5个不同的许可证,因此我创建了5个不同的映像,每个映像都有一个特定的许可证文件和目录。
许可证也固定在MAC地址上,因此当我运行五个容器之一时,我用以下--mac-address
参数指定其自己的MAC地址:
docker run --rm --mac-address AB:CD:EF:12:34:56 me/application-license1
这项工作,但我希望有一种更好,更聪明的方式来管理:
因为docker-compose
可以指定容器的MAC地址,所以当我使用5个容器构建容器时,是否可以使用未许可的基本映像并复制许可文件和许可目录docker-compose
?
编辑:让我更好地解释许可证文件的结构
该应用程序将部署到/opt/application
Docker映像的目录中。
许可证文件(*.license
)/opt/application
与应用程序本身处于同一级别,因为除非创建一些符号链接,否则它们无法保存到Docker卷中(但我必须检查应用程序是否可以这种方式工作)。
目录application-license-dir需要位于/var/lib/application-license-dir
,因此可以将其安装到Docker卷中(我必须检查该应用程序是否可以运行,但我认为可以)。
这两个*.license
文件和文件到application-license-dir
是二进制的,所以我不能脚本或在运行时创建它们。
所以:
docker-compose
结合并将其安装在一个码头工人卷之前创建多克尔主机服务器上的本地目录?docker-compose
将我的许可证文件和许可证目录从GIT存储库(本地克隆)复制到在步骤1中创建的本地目录中?docker-compose
在容器/opt/application
目录中创建一些符号链接,以*.license
存储到卷中的文件?对于每次您运行容器或在不同系统上运行容器时有所不同的情况,通常不希望在Dockerfile中指定它们。这包括您在上面显示的许可证文件;用户ID之类的内容也与此模式匹配;根据配置文件的固定程度,它们也可以计算在内。(对于每次运行容器都相同的事情,您确实希望它们出现在映像中;尤其是这是应用程序源代码。)
您可以使用Docker绑定安装在运行时将文件注入到容器中。使用volumes:
指令的绑定安装有Compose语法。
这将为您提供一个大致的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'
这样的绑定安装非常适合将配置文件推送到容器中。它们可以提供一个空的主机目录,可以在其中写入日志文件,但否则就不是从映像中复制数据的机制。如果您的应用程序无法将其所有状态存储在外部数据库中,它们还可以用作存储需要用完容器的数据的场所。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句