docker-compose 不设置环境变量

问题描述 投票:0回答:3

当我运行

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 docker-compose
3个回答
20
投票

这很正常

docker-compose
只在容器的运行阶段设置
environment
文件中的
docker-compose.yaml
指令指定的环境变量,而不是在构建阶段。

所以如果你这样做

docker-compose run --entrypoint "/bin/bash" redis -c env
你将能够看到你的环境变量。

如果你想在你的 Dockerfile 中设置变量(以便能够在构建阶段看到它们)你可以在你的

RUN env
:

之前添加到你的 dockerfile 中
ENV FOO bar

0
投票

嗯 我已经测试并找到了以下解决方案,用于 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

你很高兴。


0
投票

这是因为当(我猜)您想在

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
块用于定义运行容器的变量(当
docker-compose up
时,NOT
docker-compose build
时)。

© www.soinside.com 2019 - 2024. All rights reserved.