我想在主机和 docker 容器之间正确共享目录
其中相同的 UID
和 GID
在两个系统上使用。
为此,我想将它们作为变量 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/