簡體   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