docker - 如何通过 docker-compose 将变量传递给 Dockerfile

标签 docker docker-compose dockerfile

我想在主机和 docker 容器之间正确共享目录 其中相同的 UIDGID 在两个系统上使用。 为此,我想将它们作为变量 MY_UID=$(id -u) 传递给 docker。

我们正在考虑 .env 的行引用了一些变量,例如 MY_UID=$(id -u)不是 MY_UID=1000

这样的行值

变量被正确声明,导出为环境变量 它适用于 docker-compose.yml 级别,但 docker-compose 不会将它们进一步传递给 Dockerfile。

到目前为止,我已经在 docker-compose.yml 中尝试过:

  • env_file 字段
  • 环境领域

与 bash 一起:

  • 导出变量,例如:
    • 猫.env |环境物质 | docker-compose -f - ...
    • VAR=123 docker-compose ...

或 docker-compose -e 的选项。

给定变量的整个路径是 export > docker-compose > dockerfile。


出于测试目的,Dockerfile 很简单,例如: (在此级别变量不起作用!)

FROM heroku/heroku:18 AS production
RUN useradd -ms /usr/bin/fish -p $(openssl passwd -1 django) --uid "$MY_UID" --gid "$MY_GID" -r 

并且在使用 docker-compose 时 $MY_UID 为空。


docker-compose.yml (在此级别变量有效!)

version: '3.7'

networks: {}
services:
  django:
    build:
      context: ${MY_DIR}
      dockerfile: ${COMPOSE_DIR}/django/Dockerfile
    env_file:
      - .env
    environment:
      - MY_UID: ${MY_UID}
    volumes:
      - ${MY_DIR}:/app:rw

docker-compose 配置返回: 我的 GID:$$(id -u) 对于 .env:MY_GID=$(id -u)


我想避免这样的解决方法:

source .env && cat template_Dockerfile | envsubst > Dockerfile

源.env && 猫.env | envsubst > .env_for_dockercompose

最佳答案

关于将值从 docker-compose(或仅从 CLI)传递到 Dockerfile 的正确方法,我想您需要添加一些 ARG 指令,例如:

FROM heroku/heroku:18 AS production
ARG MY_UID="...default UID..."
ARG MY_GID="...default GID..."
RUN useradd -ms /usr/bin/fish -p $(openssl passwd -1 django) --uid "$MY_UID" --gid "$MY_GID" -r 

然后进行测试:

$ docker build --build-arg=MY_UID="1000" --build-arg=MY_GID="1000" -t test .

我使用类似的方法 in the Dockerfile of coqorg/base (基于 Debian)。

但是,如果您对传递变量以确保 UID/GID 匹配特别感兴趣,请注意另一种方法可能具有额外的好处,可以使您的图像与使用不同 UID/GID 的多个主机兼容。 在 this SO answer by @BMitch 中进行了描述建议在启动时修复容器目录的权限,例如:

关于docker - 如何通过 docker-compose 将变量传递给 Dockerfile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54885609/

相关文章:

docker - 如何授予系统用户在 docker 容器中运行命令的正确权限?

docker - 错误/dev/tty : No such device or address when installing sqlcmd inside docker

docker-compose - 无法在使用 BUILD 时创建的文件夹中使用绑定(bind)挂载

docker - 在macOS 10.13上使用Docker CE从ubuntu基本镜像构建docker镜像时,连接失败错误

java - 在 docker 中调试 spring-boot

docker - 升级GKE工作节点中的docker版本

php - PhpStorm + Docker + Xdebug + DB SSH隧道

docker - Docker的Inception和Work目录

docker - 如何测试docker卷?

docker - 如何创建准备使用 docker-compose 进行部署的镜像