docker-compose不设置环境变量

bgibtngc  于 2023-03-01  发布在  Docker
关注(0)|答案(3)|浏览(190)

当我运行docker-compose build && docker-compose up redis时,在docker-compose.yaml中指定了environment,在Dockerfile中指定了RUN env,我设置的环境变量没有被输出。
为什么这行不通?
我使用的是docker-compose版本1.4.2。
以下是相关文件:

docker-compose.yamlenvironment作为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'

一个月一个月:

FROM redis:2.6
MAINTAINER me@email.com

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"]
ct2axkht

ct2axkht1#

这很正常
docker-compose仅在容器的运行阶段设置docker-compose.yaml文件中的environment指令中指定的环境变量,而不在构建阶段设置。
因此,如果您执行docker-compose run --entrypoint "/bin/bash" redis -c env,您将能够看到您的env变量。
如果你想在你的文档文件中设置变量(以便在构建阶段能够看到它们),你可以在你的文档文件中添加RUN env

ENV FOO bar
ryevplcw

ryevplcw2#

好吧,我已经测试,并发现以下解决方案的docker组成与环境文件或没有环境文件。我将向您展示两种不同的方法
让我们假设你有以下docker组成的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--环境文件docker.env
你可以走了。

nr9pn0ug

nr9pn0ug3#

这是因为当(我猜)您想在build块中使用args时,您正在使用environment

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时,NOTdocker-compose build时)。
对类似问题的类似回答可能会引起兴趣:

相关问题