我在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数据,我可以使用它。
这里的问题是您的 ENV
只能从运行阶段访问,而不是从构建
阶段访问。
我建议您使用build<code>args</code>,例如:
build:
context: .
args:
buildno: 1
gitcommithash: cdc3b19
您可以使用参数
来满足您的要求。
这里有一个注意事项:您不应该在< 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将 直