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

时间:2019-10-30 18:13:46

标签: docker gradle docker-compose

我有这个.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 compose文件中,如下所示:

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文件中的变量将数据添加到卷?

2 个答案:

答案 0 :(得分:0)

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

您现有的volumes属性将在运行时将此文件映射到容器中,并将其放置在容器的/config中。

答案 1 :(得分:0)

普通Docker和Docker Compose没有此功能。您可以在主机上的Docker外部创建文件并将其安装到容器中,如图所示,但是Docker和Compose都不具备执行此操作所需的模板功能。

您在问题中描述的总体方法是为每组配置选项构建一个自定义图像。这实际上不是最佳实践:想象一下,由于您连接了需要查看的USB驱动器,因此需要重新编译ls

您可以在普通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包管理器确实具有一个模板系统,可以为可注入到pod中的ConfigMap对象创建内容;但这是大量的额外机器。)< / p>