在 Dockerfile 中使用环境变量
Posted
技术标签:
【中文标题】在 Dockerfile 中使用环境变量【英文标题】:Use env variables in Dockerfile 【发布时间】:2019-12-07 15:08:09 【问题描述】:我在一个 php 项目中有一个 Dockerfile,在执行期间我需要传递用户和密码来下载库。
用户和密码必须隐藏在生产环境或本地 .env 文件中。目前我只是在尝试本地选项,用户和密码为空。
我使用了"$USER"
和$USER
,但不仅登录失败,而且当我打印变量时,它们变为空。此外,我尝试将变量硬编码,它工作正常,所以问题是变量不是从 .env 文件中检索到的。
docker-compose 启动如下
version: '3'
services:
server:
build:
context: .
dockerfile: docker/Server/Dockerfile
container_name: "server"
ports:
- 80:80
- 8888:8888
networks:
- network
env_file:
- .env
command: sh /start-workers.sh
还有 Dockerfile:
FROM php:7.3-cli-alpine3.10
RUN apk add --update
#
# Dependencies
#
RUN apk add --no-cache --no-progress \
libzip-dev zip php7-openssl pkgconfig \
php-pear php7-dev openssl-dev bash \
build-base composer
#
# Enable PHP extensions
#
RUN docker-php-ext-install bcmath sockets pcntl
#
# Server Dependencies
#
RUN echo '' | pecl install swoole \
&& echo "extension=swoole.so" >> /usr/local/etc/php/conf.d/swoole.ini
#
# installation
#
WORKDIR /var/www/service
COPY . .
RUN echo "START"
RUN echo "$USER"
RUN echo "$PASSWORD"
RUN echo "END"
RUN composer config http.libraries.com "$USER" "$PASSWORD" --global \
&& composer install -n -o --prefer-dist --no-dev --no-progress --no-suggest \
&& composer clear-cache \
&& mv docker/Server/start-workers.sh /
EXPOSE 80
.env 开始和结束如下:
APP_ENV=dev
APP_SECRET=666666666666666
.
.
.
USER=user
PASSWORD=password
目前如果我执行docker-compose up --build
输出如下
Step 10/15 : RUN echo "START"
---> Running in 329b1707c2ab
START
Removing intermediate container 329b1707c2ab
---> 362b915ef616
Step 11/15 : RUN echo "$USER"
---> Running in e052e7ee686a
Removing intermediate container e052e7ee686a
---> 3c9cfd43a4df
Step 12/15 : RUN echo "$PASSWORD"
---> Running in b568e7b8d9b4
Removing intermediate container b568e7b8d9b4
---> 26a727ba6842
Step 13/15 : RUN echo "END"
---> Running in 726898b3eb42
END
我想打印用户和密码,所以我知道我正在接收 .env 数据并且可以使用它。
【问题讨论】:
不要期望 Dockerfile 使用您的环境变量。而是将它们作为构建参数传递给docker build
命令。
这能回答你的问题吗? Can we pass ENV variables through cmd line while building a docker image through dockerfile?
【参考方案1】:
您可以使用args
来满足您的要求。
这里有一个注意事项:你不应该在.env
中使用USER
作为关键字,因为它将被bash 的默认环境USER
覆盖,这将使你的dockerfile 无法获得正确的值。
一个完整可行的最小示例如下,仅供参考:
docker/Server/Dockerfile:
FROM php:7.3-cli-alpine3.10
ARG USER
ARG PASSWORD
RUN echo $USER
RUN echo $PASSWORD
.env(注意:您必须在这里使用 USR,而不是 USER):
USR=user
PASSWORD=password
docker-compose.yaml:
version: '3'
services:
server:
build:
context: .
dockerfile: docker/Server/Dockerfile
args:
- USER=$USR
- PASSWORD=$PASSWORD
执行:
$ docker-compose build --no-cache
Building server
Step 1/5 : FROM php:7.3-cli-alpine3.10
---> 84d7ac5a44d4
Step 2/5 : ARG USER
---> Running in 86b35f6903e2
Removing intermediate container 86b35f6903e2
---> ee6a0e84c76a
Step 3/5 : ARG PASSWORD
---> Running in 92480327a820
Removing intermediate container 92480327a820
---> 1f886e8f6fbb
Step 4/5 : RUN echo $USER
---> Running in 8c207c7e6080
user
Removing intermediate container 8c207c7e6080
---> cf97b2cc0317
Step 5/5 : RUN echo $PASSWORD
---> Running in 7cbdd909826d
password
Removing intermediate container 7cbdd909826d
---> 6ab7987e080a
Successfully built 6ab7987e080a
Successfully tagged 987_server:latest
【讨论】:
谢谢@atline,很好的解释。有效。关于 USER,它是用于帖子的通用名称,但无论如何感谢您的信息! 这不是他要求的。 ARGS 不同于使用环境变量【参考方案2】:这里的问题是您的ENV
只能从运行阶段访问,而不是build
。
我建议你使用 build args
例如:
build:
context: .
args:
buildno: 1
gitcommithash: cdc3b19
【讨论】:
以上是关于在 Dockerfile 中使用环境变量的主要内容,如果未能解决你的问题,请参考以下文章
在 Dockerfile 中,如何更新 PATH 环境变量?