当前位置: 首页 > 知识库问答 >
问题:

在Dockerfile中使用env变量

商柏
2023-03-14

我在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-compup - 构建输出如下

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数据,我可以使用它。

共有2个答案

车胤运
2023-03-14

这里的问题是您的 ENV 只能从运行阶段访问,而不是从构建阶段访问。

我建议您使用build<code>args</code>,例如:

build:
  context: .
  args:
    buildno: 1
    gitcommithash: cdc3b19
长孙德惠
2023-03-14

您可以使用参数来满足您的要求。

这里有一个注意事项:您不应该在< code >中使用< code>USER。env作为关键字,因为它将被bash的默认环境< code>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
 类似资料:
  • 我正在尝试dockerize一个基本的nodejs应用程序。我的dockerfile如下 但我总是收到同样的错误 我该怎么解决?

  • 问题内容: 我有一个Dockerfile,我想使用默认值来配置API。 来自socialengine / nginx-spa ENV API_URL本地主机:6007 因此,当我运行此映像时,我将能够使用以下内容覆盖localhost:6007: 码头工人运行-e API_URL = production.com:6007 ui 这是行不通的,我找不到如何执行此操作的清晰说明。 有什么建议吗? 问

  • 问题内容: 我正在使用Docker和Docker-compose构建一堆nginx + php。 我试图在我的文件中设置时区,并在Dockerfile中使用它,但是我可能会误解文档中的内容。 .env docker-compose.yml php7-fpm / Dockerfile 容器内部的时区设置不正确(在php容器bash中运行)。如果我在Dockerfile中手动编写区域,那么它将起作用。

  • 我试图设置一个ENV等于Python脚本输出在我的dockerfile。由于分层,我无法找到将它们放在同一层的方法。我也无法找到一种方法将变量直接设置为等于脚本,我似乎无法找到如何在同一行中运行脚本。 python是一个简单的打印,称为test.py: 到目前为止,我已经在dockerfile中尝试了以下几个版本,以将ENV设置为脚本: 是否可以一步将ENV testvar设置为脚本的值,或者确保

  • 问题内容: 是否可以根据构建的值在Dockerfile中有条件地设置变量? 例如:类似 更新:基于Mario的答案的当前用法: 但是,先运行然后进入主机,我仍然可以 问题答案: 是的,可以,但是您需要使用build参数作为标志。您可以使用Shell的参数扩展功能来检查条件。这是概念验证的Docker文件: 测试版本:

  • 问题内容: 在我的Dockerfile中: 错误: 最快的解决方法是什么?Docker是否有计划“修复”或在更高版本的Docker中引入此功能? 注意:如果我从Docker文件中删除CMD行,然后运行Docker容器,则能够从容器内部手动运行Django-admin startproject $ PROJECTNAME,它将创建项目… 问题答案: 当您使用执行列表时,如… …然后Docker将 直