代码之家  ›  专栏  ›  技术社区  ›  Dmitrij Kultasev

将本地命令的输出写入docker容器中的文件

  •  0
  • Dmitrij Kultasev  · 技术社区  · 4 年前

    我有一个有各种变量的文件模板。在将此文件复制到之前,我想用值构成这些变量 跑步 容器这就是我现在所做的:

    export $(grep -v '^#' /home/user/.env | xargs) && \
        envsubst < template.yaml > new_connection.yaml && \
        docker cp new_connection.yaml docker_container:/app && \
        rm new_connection.yaml
    

    这是可行的,但我相信有一种方法可以跳过文件创建/复制/删除步骤,只做以下操作: echo SOME_TEXT > new_connection.yaml 直接送到集装箱。你能帮忙吗?

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

    这似乎是一个很好的应用程序 入口点包装脚本 。如果您的图像同时具有 ENTRYPOINT CMD 然后 Docker passes the CMD as additional arguments to the ENTRYPOINT 。这样就可以编写一个简单的脚本来重写配置文件,然后运行 CMD :

    #!/bin/sh
    envsubst < template.yaml > /app/new_connection.yaml
    exec "$@"
    

    在Dockerfile中, COPY 中的脚本并使其成为 入口点 。(如果您的主机系统没有正确地保留可执行文件权限或Unix行结尾,您可能还需要在Dockerfile中进行一些额外的修复。)

    COPY entrypoint.sh ./
    ENTRYPOINT ["/app/entrypoint.sh"]  # must be JSON-array form
    CMD same command as the original image
    

    运行容器时,需要传入环境文件,但有一个内置选项

    docker run --env-file /home/user/.env ... my-image
    

    如果你想看到这一点,你在镜像名称后提供的任何命令都会替换Dockerfile CMD ,但它仍将传递给 入口点 作为论据。因此,例如,您可以在一个新的临时容器中看到重写的配置文件:

    docker run --rm --env-file /home/user/.env my-image \
      cat /app/new_connection.yaml
    
        2
  •  0
  •   The Fool    4 年前

    总的来说,我同意David Maze和评论部分的观点。您可能应该以这样一种方式构建映像,即它在启动时获取env-var并相应地使用它们。


    但是,为了回答您的问题,您可以通过管道输出 envsubst 到正在运行的容器。

    $ echo 'myVar: ${FOO}' > env.yaml
    $ FOO=bar envsubst < env.yaml | docker run -i busybox cat
    myVar: bar
    

    如果你想使用重定向将其写入文件,你需要将其包装在 sh -c 因为否则重定向被视为将容器输出重定向到主机上的某个路径。

    FOO=bar envsubst < env.yaml | docker run -i busybox sh -c 'cat > my-file.yaml'
    

    我在这里做的 docker run 但你也可以用 exec

    FOO=bar envsubst < env.yaml | docker exec -i <container> cat
    
    推荐文章