在 Dockerfile 中使用环境变量

我在一个 php 项目中有一个 Dockerfile,我需要在执行过程中传递一个用户和一个密码来下载一个库。


用户和密码必须隐藏在生产环境或本地 .env 文件中。目前我只是尝试本地选项,用户和密码为空。


我使用了"${USER}"and ${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 数据并且我可以使用它。


慕田峪7331174
浏览 136回答 2
2回答

森林海

您可以使用args来满足您的要求。这里的一个注意事项是:您不应该使用USERin.env作为关键字,因为它将被 bash 的默认环境覆盖,USER这将使您的 dockerfile 无法获得正确的值。一个完整可行的最小示例如下,仅供参考:码头工人/服务器/Dockerfile:FROM php:7.3-cli-alpine3.10ARG USERARG PASSWORDRUN echo ${USER}RUN echo ${PASSWORD}.env(注意:你必须使用 USR,而不是这里的 USER):USR=userPASSWORD=passworddocker-compose.yaml:version: '3'services:  server:    build:      context: .      dockerfile: docker/Server/Dockerfile      args:         - USER=${USR}         - PASSWORD=${PASSWORD}执行:$ docker-compose build --no-cacheBuilding serverStep 1/5 : FROM php:7.3-cli-alpine3.10 ---> 84d7ac5a44d4Step 2/5 : ARG USER ---> Running in 86b35f6903e2Removing intermediate container 86b35f6903e2 ---> ee6a0e84c76aStep 3/5 : ARG PASSWORD ---> Running in 92480327a820Removing intermediate container 92480327a820 ---> 1f886e8f6fbbStep 4/5 : RUN echo ${USER} ---> Running in 8c207c7e6080userRemoving intermediate container 8c207c7e6080 ---> cf97b2cc0317Step 5/5 : RUN echo ${PASSWORD} ---> Running in 7cbdd909826dpasswordRemoving intermediate container 7cbdd909826d ---> 6ab7987e080aSuccessfully built 6ab7987e080aSuccessfully tagged 987_server:latest

蛊毒传说

这里的问题是您ENV只能从运行阶段访问而不是build.我建议你使用 buildargs例如:build:   context: .   args:     buildno: 1     gitcommithash: cdc3b19
打开App,查看更多内容
随时随地看视频慕课网APP