当我运行
docker-compose build && docker-compose up redis
时,在environment
中指定docker-compose.yaml
,在RUN env
中指定Dockerfile
,我设置的环境变量不会被打印出来。
为什么这不起作用?
我正在使用
docker-compose
版本 1.4.2.
以下是相关文件:
docker-compose.yaml
与 environment
作为 KEY=value
对的列表:
redis:
build: ../storage/redis
ports:
- "6379:6379"
environment:
- FOO='bar'
docker-compose.yaml
与 environment
作为字典:
redis:
build: ../storage/redis
ports:
- "6379:6379"
environment:
- FOO: 'bar'
Dockerfile
:
FROM redis:2.6
MAINTAINER [email protected]
RUN mkdir -p /var/redis && chown -R redis:redis /var/redis
RUN echo '-------------- env ---------------'
RUN env
COPY redis.conf /usr/local/etc/redis/redis.conf
EXPOSE 6379
ENTRYPOINT ["redis-server", "/usr/local/etc/redis/redis.conf"]
这很正常
docker-compose
只在容器的运行阶段设置environment
文件中的docker-compose.yaml
指令指定的环境变量,而不是在构建阶段。
所以如果你这样做
docker-compose run --entrypoint "/bin/bash" redis -c env
你将能够看到你的环境变量。
如果你想在你的 Dockerfile 中设置变量(以便能够在构建阶段看到它们)你可以在你的
RUN env
: 之前添加到你的 dockerfile 中
ENV FOO bar
嗯 我已经测试并找到了以下解决方案,用于 docker compose with env file 或 without env file。我会告诉你两种不同的方法
假设您有以下 docker compose yml 文件
version: '3.8'
services:
db:
image: postgres:13
volumes:
- "./volumes/postgres:/var/lib/postgresql/data"
ports:
- "5432:5432"
env_file: docker.env
现在您需要在名为 docker.env 的文件中设置 postgres 变量。请记住,您需要将 docker_compose.yml 文件和 docker.env 文件保存在同一文件夹中。 接下来,在 docker.env 文件中,您需要像这样拥有数据库变量和值:
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_DB=myapp_db
现在点击 docker-compose up 。它应该工作。 假设现在您不想在 docker-compose.yml 文件中指定 env 文件名。所以你必须这样写 docker-compose.yml 文件:
version: '3.8'
services:
db:
image: postgres:13
volumes:
- "./volumes/postgres:/var/lib/postgresql/data"
ports:
- "5432:5432"
environments:
- POSTGRES_USER=${PGU}
-POSTGRES_PASSWORD=${PGP}
-POSTGRES_DB=${PGD}
现在你的 docker.env 文件应该是这样的:
PGU=postgres
PGP=postgres
PGD=myapp_db
现在点击 docker-compose --env-file docker.env up
你很高兴。
这是因为当(我猜)您想在
environment
块内使用 args
时,您正在使用 build
:
redis:
build:
context: ../storage/redis
args:
- FOO: 'bar'
ports:
- "6379:6379"
您的 Dockerfile 将在(图像)环境中定义
FUN
:
FROM redis:2.6
RUN mkdir -p /var/redis && chown -R redis:redis /var/redis
# Read FUN from (build) arguments
# (may define a default: ARG FUN='wow')
ARG FUN
# Define env variable FUN with value from ARG
ENV FUN=$FUN
RUN echo '-------------- env ---------------'
RUN env
COPY redis.conf /usr/local/etc/redis/redis.conf
EXPOSE 6379
ENTRYPOINT ["redis-server", "/usr/local/etc/redis/redis.conf"]
块用于定义运行容器的变量(当environment
时,NOT当docker-compose up
时)。docker-compose build