使用 env_file 在 docker-compose.yml 中设置构建参数

PAN*_*ack 10 docker docker-compose

我正在尝试使用 Docker 和Docker Compose创建一个容器化应用程序。我有一个 PubNub 帐户,它允许我为不同的环境(开发、测试、生产)使用不同的 API 密钥。为了帮助我为此构建图像,我尝试使用带有env_file 的构建参数集。

它不起作用。

WARNING: The PUB_KEY variable is not set. Defaulting to a blank string.
WARNING: The SUB_KEY variable is not set. Defaulting to a blank string.
Run Code Online (Sandbox Code Playgroud)

问题:

  • 我在设置构建参数时犯了什么错误?
  • 我如何解决它?
  • 这是一个很好的方式来设置ENV的容器变量scanflask

最底部是IntelliJ IDE 屏幕截图,或者文本代码就在下面。

以下是docker-compose.yml内容:

version: '3.6'

services:

  scan:
    env_file:
      - sample.env
    build:
      context: .
      dockerfile: Dockerfile
      args:
        pub_key: $PUB_KEY
        sub_key: $SUB_KEY
      target: scan
    image: bt-beacon/scan:v1

  flask:
    env_file:
      - sample.env
    build:
      context: .
      dockerfile: Dockerfile
      args:
        pub_key: $PUB_KEY
        sub_key: $SUB_KEY
      target: flask
    image: bt-beacon/flask:v1
    ports:
      - "5000:5000"
Run Code Online (Sandbox Code Playgroud)

Dockerfile

# --- BASE NODE ---
FROM python:3.6-jessie as base
ARG pub_key
ARG sub_key

RUN test -n "$pub_key"
RUN test -n "$sub_key"

# --- SCAN NODE ---
FROM base as scan

ENV PUB_KEY=$pub_key
ENV SUB_KEY=$sub_key

COPY app/requirements.scan.txt /

RUN apt-get update
RUN apt-get -y install bluetooth bluez bluez-hcidump python-bluez python-numpy python3-dev libbluetooth-dev libcap2-bin
RUN pip install -r /requirements.scan.txt
RUN setcap 'cap_net_raw,cap_net_admin+eip' $(readlink -f $(which python))

COPY app/src /app
WORKDIR /app

CMD ["./scan.py", "$pub_key", "$sub_key"]


# -- FLASK APP ---
FROM base as flask

ENV SUB_KEY=$sub_key

COPY app/requirements.flask.txt /
COPY app/src /app

RUN pip install -r /requirements.flask.txt

WORKDIR /app

EXPOSE 5000

CMD ["flask", "run"]
Run Code Online (Sandbox Code Playgroud)

最后,sample.env

# PubNub app keys here
PUB_KEY=xyz1
SUB_KEY=xyz2
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

And*_*sky 11

env_file只能在服务容器内设置环境变量。变量 fromenv_file不能注入到docker-compose.yml自身中。

你有这样的选择(在那里有详细描述):

  • 将这些变量注入到您运行的 shell 中 docker-compose up
  • 创建.env包含这些变量的文件(语法与您的相同sample.env

我个人会将镜像构建过程和容器启动过程分开(将镜像构建责任从 docker-compose 转移到外部脚本,然后构建过程可以轻松配置)。

  • 谢谢 - 听起来答案是“你想要的现在是不可能的”。需要明确的是,您的首选是使用脚本调用“build”并推送到 Docker 存储库,然后使用“docker-compose.yml”来提取现有映像? (2认同)
  • 如果您想要快速、简单的解决方案,只需从 compose 中删除 `env_file` 部分即可。并将“sample.env”重命名为“.env”,一切都应该正常 (2认同)
  • `ARG` 语句必须出现在每个构建阶段,而不仅仅是基础 (2认同)