Dockerfile:有没有办法仅在 ARG 存在时设置 ENV?

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

我只想在 ARG 存在时设置 ENV。

我想做的事:

FROM ruby:3.0.1

ARG RAILS_MASTER_KEY

if [[ -n "$RAILS_MASTER_KEY" ]] ;
  then ENV RAILS_MASTER_KEY=$RAILS_MASTER_KEY
fi

环境;

  • 使用凭证的 ruby on Rails
    • 凭证/development.yml.enc
    • 开发.key
  • 秘密环境的 CircleCI 上下文
  • Dockerfile.local 用于本地

我的一项服务有 3 个存储库。

  • 网页(前端)
  • 应用程序(后端)
  • API

每个存储库都有 docker-compose.yml,它通过 Dockerfile 构建自己的镜像,并从 ECR 拉取其他存储库的镜像。

合并到主分支后,CircleCI 通过 Dockerfile 构建镜像并推送到 ECR。

因为我通过 CircleCI 上下文管理我的密钥, 所以当 CircleCI 构建镜像时我通过

--build-arg
传递密钥,当我在本地构建存储库时我不需要 ENV,因为我在本地有密钥文件。

这是我尝试过的,但 ENV 仍然设置为空值,如

RAILS_MASTER_KEY=
。由于这个问题,当 docker-compose up 时,我的 Rails 容器无法启动。

Dockerfile 之前

FROM ruby:3.0.1

ARG RAILS_MASTER_KEY

ENV RAILS_MASTER_KEY=$RAILS_MASTER_KEY

我尝试过的:

  1. 不工作
FROM ruby:3.0.1

ARG RAILS_MASTER_KEY

RUN if [[ -n "$RAILS_MASTER_KEY" ]] ; then export RAILS_MASTER_KEY=$RAILS_MASTER_KEY; fi
  1. 不工作
FROM ruby:3.0.1

ARG RAILS_MASTER_KEY

ENV RAILS_MASTER_KEY=$RAILS_MASTER_KEY
RUN if [[ -z "$RAILS_MASTER_KEY" ]] ; then unset RAILS_MASTER_KEY; fi

以下是 CircleCi 配置文件仅供参考。

...
commands:
  # image-build-push for k8s
  build-push-image:
    steps:
      - checkout
      - setup_remote_docker:
          docker_layer_caching: true
      - aws-ecr/build-and-push-image:
          dockerfile: ${DOCKER_FILE_PATH}
          no-output-timeout: 20m
          region: AWS_DEFAULT_REGION
          repo: ${ECR_REPO_NAME}
          tag: ${IMAGE_TAG}
          extra-build-args: --build-arg RAILS_MASTER_KEY=${RAILS_MASTER_KEY}
...
docker dockerfile
2个回答
0
投票

更新

最后,我使用 Dockerfile 中的

env_file
解决了这个问题。

...
services:
  app:
    build:
      context: .
      dockerfile: docker/Dockerfile.local
    env_file:
      - docker/env/.env.api.local

  app:
    image: ....
    env_file:
      - docker/env/.env.app.local
...

并向成员分享 .env 文件。

#.gitignore
...
.env.*
...

这样做,

  • 我不需要为本地分离 Dockerfile。
  • 我不需要使用 CircleCI Context。 (我认为使用 CircleCI Context 不太好,因为我的应用程序的一些信息将依赖于 CircleCI。)

我的三个存储库各有

.env.api.local
.env.app.local
文件,并且 docker-compose 在每个服务上将文件读取为
env_file

之前

我通过制作一个单独的 Dockerfile 来解决。

Dockerfile.local
docker-compose.yml

CircleCI 中的

Dockerfile.dev
config.yml
我使用
--build-arg

传递 ARG

Dockerfile.local;

# for local
# built by docker-compose 
# not using ENV
FROM ruby:3.0.1

...

Dockerfile.dev;

# image for other repository
# built and push by CircleCI
# using ENV
FROM ruby:3.0.1

ARG RAILS_MASTER_KEY

ENV RAILS_MASTER_KEY=$RAILS_MASTER_KEY
...

0
投票

实现相同目标的另一种黑客方法是始终设置some环境变量,但仅在 ARG 有值时设置正确的。例如:

ARG RAILS_MASTER_KEY
ENV ${RAILS_MASTER_KEY:+RAILS_MASTE}R_KEY=${RAILS_MASTER_KEY}

这里,当 ARG

RAILS_MASTER_KEY
具有值时,ENV
RAILS_MASTER_KEY
被设置为该值。如果 ARG
RAILS_MASTER_KEY
未通过,则会创建一个名为
R_KEY
的无害 ENV(您可以任意中断到“真实”ENV 名称中的任何其他无害位置)并设置为 void(即任何寻找 ENV
RAILS_MASTER_KEY 的代码) 
找不到)。

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