我只想在 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
环境;
我的一项服务有 3 个存储库。
每个存储库都有 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
我尝试过的:
FROM ruby:3.0.1
ARG RAILS_MASTER_KEY
RUN if [[ -n "$RAILS_MASTER_KEY" ]] ; then export RAILS_MASTER_KEY=$RAILS_MASTER_KEY; fi
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}
...
最后,我使用 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.*
...
这样做,
我的三个存储库各有
.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
...
实现相同目标的另一种黑客方法是始终设置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
的代码)
找不到)。