繁体   English   中英

如何使用 docker-compose.yml 中的值将文件添加到 Docker 映像中的卷?

[英]How can I add a file to a volume in a Docker image, using values from the docker-compose.yml?

我有这个.env 文件:

admin=admin
password=adminsPassword
stackName=integration-demo

其值在 docker-compose.yml 文件中使用,如下所示:

    myService:
      build: 
        context: .
        dockerfile: myService.Dockerfile
        args:
          - instance=${stackName}.local
          - admin=${admin}
          - password=${password}
        volumes:
           - ./config:/config

我想将它们添加到 Docker 撰写文件中,如下所示:

FROM openjdk:8-jdk-alpine

ARG docker_properties_file=Username=$admin\nPassword=$password\nHost=$instance

RUN $docker_proprties_file >> config/gradle-docker.properties

这样我就有一个 gradle-docker.properties 文件,如下所示:

username=admin
password=adminsPassword
host=integration.demo.local

在 /config 目录中。

但是,没有写入 gradle-docker.properties 文件。

如何使用 docker-compose.yml 文件中的变量将数据添加到卷?

实现目标的一种方法是在主机上创建${PWD}/config/grade-docker.properties文件,其中${PWD}/docker-compose.yml ... ${PWD}为清楚起见。

然后,您现有的volumes属性将在运行时将此文件 map 放入容器中,并将其放置在容器的/config中。

普通 Docker 和 Docker Compose 没有此功能。 您可以在主机上的 Docker 之外创建文件并将其安装到容器中,但 Docker 和 Compose 都没有您需要能够执行此操作的模板功能。

您在问题中描述的整体方法为每组配置选项构建了一个自定义图像。 这并不是一个真正的最佳实践:想象一下需要重新编译ls因为您附加了一个需要查看的 USB 驱动器。

您可以在普通 Docker 中做的一件事是教映像如何在启动时创建自己的配置文件。 您可以使用以下脚本执行此操作,例如:

#!/bin/sh
# I am docker-entrypoint.sh

# Create the config file
cat >config/gradle-docker.properties <<EOF
username=$USERNAME
et=$CETERA
EOF

# Run the main container process
exec "$@"

在您的 Dockerfile 中,将此文件COPY到图像中并将其设置为ENTRYPOINT 保持CMD不变。 您必须使用ENTRYPOINT指令的 JSON 数组形式。

...
COPY docker-entrypoint.sh .
RUN chmod +x docker-entrypoint.sh
ENTRYPOINT ["./docker-entrypoint.sh"]
CMD ["java", "-jar", "application.jar"]

(在 Kubernetes 中,Helm package 管理器确实有一个模板系统,可以为 ConfigMap object 创建内容,可以将大量额外的机器注入到 apod 中);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM