代码之家  ›  专栏  ›  技术社区  ›  firasKoubaa

Docker compose:如何定义指向容器中某个文件而不是物理服务器的env_文件

  •  0
  • firasKoubaa  · 技术社区  · 6 年前

    我有一些服务在里面运行 docker compose 文件:

    myService:  
              image: 127.0.0.1:myimage
              stdin_open: true
              tty: true
              ports:
                - target: 8800
                  published: 8800
                  protocol: tcp
                  mode: host
              deploy:
                mode: global
                resources:
                  limits:
                    memory: 1024M
                placement:
                  constraints:
                    - node.labels.myLabel== one
              env_file:
                - /opt/app/myFile.list # I WANT TO REUSE SOME FILE INSIDE THE CONTAINER
              healthcheck:
                disable: true
    

    如您所见,我需要声明一个env文件:

    env_file:
         - /opt/app/myFile.list # I WANT TO REUSE SOME FILE INSIDE THE CONTAINER
    

    我的目的是如何重用 容器中的一些文件不指向物理机器。

    建议?

    0 回复  |  直到 6 年前
        1
  •  0
  •   David Maze    6 年前

    Docker(Compose)本身并不直接支持这一点,但它很容易添加到您的图像中。

    请记住,有两种机制可以将命令行传递给Docker。如果同时使用入口点和命令,则入口点将作为主容器进程启动,并将命令作为参数传递。这使您可以进行首次设置(如设置环境变量),然后 exec 命令。

    这类应用程序的典型入口点脚本可能如下所示

    #!/bin/sh
    if [ -n "$ENV_FILE" ]; then
      . "$ENV_FILE"
    fi
    exec "$@"
    

    你会把它添加到你的Docker形象中

    ...
    COPY entrypoint.sh /
    RUN chmod +x /entrypoint.sh
    ENTRYPOINT ["/entrypoint.sh"]
    CMD ["same", "as", "before"]
    

    (有几种变体使用 ENTRYPOINT 命名主应用程序或仅命名语言解释器。对于这种模式,你需要将其移动到 CMD .)

    然后,在启动容器时,设置entrypoint脚本要查找的环境变量。

    services:
      myservice:
        environment:
          ENV_FILE: /opt/app/myFile.list # inside the container
    

    如果用 docker run --rm myimage sh ,通过entrypoint脚本,您将看到这些环境变量。 docker exec 绕过入口点,您将无法获得相同的环境。低级调试工具,比如 docker inspect 也不会显示环境变量。