首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dockerfile:只有当ARG存在时,才能设置ENV吗?

Dockerfile:只有当ARG存在时,才能设置ENV吗?
EN

Stack Overflow用户
提问于 2021-12-09 06:38:19
回答 1查看 192关注 0票数 0

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

我想做的是:

代码语言:javascript
复制
FROM ruby:3.0.1

ARG RAILS_MASTER_KEY

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

环境;

使用凭据

  • credentials/development.yml.enc
  • development.key

  • ruby on rails

用于本地env

  • Dockerfile.local 的秘密
  • CircleCI上下文

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

  • web(front-end)
  • app(back-end)
  • api

并且每个存储库都有dockerCompose.yml,它通过Dockerfile构建自己的映像,并从ECR中提取其他存储库的映像。

当合并到主分支时,CircleCI通过Dockerfile构建映像并推送到ECR。

因为我是通过CircleCI上下文管理密钥的,所以在--build-arg构建映像时通过--build-arg传递密钥,并且在本地构建存储库时不需要ENV,因为本地有密钥文件。

下面是我尝试过的内容,但是ENV仍然设置为空值,比如RAILS_MASTER_KEY=。由于这个问题,我的rails容器在码头组装时不起作用。

Dockerfile之前

代码语言:javascript
复制
FROM ruby:3.0.1

ARG RAILS_MASTER_KEY

ENV RAILS_MASTER_KEY=$RAILS_MASTER_KEY

我试过的是:

  1. not work

代码语言:javascript
复制
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. not work

代码语言:javascript
复制
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配置文件FYI。

代码语言:javascript
复制
...
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}
...
EN

回答 1

Stack Overflow用户

发布于 2021-12-10 02:50:06

更新

最后,我在Dockerfile中使用env_file解决了这个问题。

代码语言:javascript
复制
...
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文件共享给成员。

代码语言:javascript
复制
#.gitignore
...
.env.*
...

这样做,

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

我的三个存储库都有.env.api.local.env.app.local文件和docker--在每个服务上以env_file的形式读取文件。

在此之前

我做了一个独立的Dockerfile来解决问题。

Dockerfile.local in docker-compose.yml.

Dockerfile.dev in CircleCI config.yml和我使用--build-arg传递ARG

Dockerfile.local;

代码语言:javascript
复制
# for local
# built by docker-compose 
# not using ENV
FROM ruby:3.0.1

...

Dockerfile.dev;

代码语言:javascript
复制
# 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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70285650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档