Docker上的Dockerfile传递环境构build

我写了一个使用两个参数的Dockerfile

 FROM jessie MAINTAINER Zeinab Abbasimazar #Build Arguments ARG REP_USER ARG REP_PASS # Build RUN echo 'REP_USER:'$REP_USER', REP_PASS:'$REP_PASS 

我写了一个docker-compose.yml来构build:

 version: "2" services: ui: build: context: . dockerfile: Dockerfile args: REP_USER: $REP_USER REP_PASS: $REP_PASS 

我不想直接在撰写文件中定义这些参数,所以我试图在docker撰写构build时发送它们:

 REP_USER=myusername REP_PASS=mypassword docker-compose build 

哪个没用 我改变了我的Dockerfile使用这些参数作为环境variables; 所以我删除了ARG行:

 FROM jessie MAINTAINER Zeinab Abbasimazar # Build RUN echo 'REP_USER:'$REP_USER', REP_PASS:'$REP_PASS 

docker-compose.yml

 version: "2" services: ui: build: context: . dockerfile: Dockerfile 

并运行REP_USER=myusername REP_PASS=mypassword docker-compose build ; 仍然没有结果。

我也尝试将这些信息保存到一个env文件中:

 version: "2" services: ui: build: context: . dockerfile: Dockerfile env_file: - myenv.env 

但似乎env文件不会在构build时影响; 他们只是参与到运行时间。

编辑1:

Docker版本是1.12.6 ,它不支持通过--build-arg传递参数。

编辑2:

我尝试使用.env文件,如下所述:

 cat .env REP_USER=myusername REP_PASS=mypassword 

然后我调用docker-compose config返回:

 networks: {} services: ui: build: args: REP_PASS: mypassword REP_USER: myusername context: /home/zeinab/Workspace/ZiZi-Docker/Test/test-exec-1 dockerfile: Dockerfile version: '2.0' volumes: {} 

这意味着这解决了我的问题。

编辑3:

我也在docker-compose.yml文件中docker-compose.yml -compose arg文档的第三部分:

 version: "2" services: ui: build: context: . dockerfile: Dockerfile args: - REP_USER - REP_PASS 

并执行:

 export REP_USER=myusername;export REP_PASS=mypassword;sudo docker-compose build --no-cache 

仍然没有得到我想要的。

您可以使用docker compose来设置构build参数,如下所述:

 docker-compose build [--build-arg key=val...] docker-compose build --build-arg REP_USER=myusername --build-arg REP_PASS=mypassword 

顺便说一句,AFAIKbuild立论点是可用性和确定性build设之间的妥协。 Docker旨在以确定性的方式构build。 也就是说,无论你在哪里执行构build,生成的图像应该是相同的。 因此,客户端忽略执行的环境(variables)似乎是合乎逻辑的。

{VARNAME} -compose文件中,variablesreplace的正确语法是$ {VARNAME} 。 试试这个:

 version: "2" services: ui: build: context: . dockerfile: Dockerfile args: REP_USER: ${REP_USER} REP_PASS: ${REP_PASS} 

我终于find了解决办法。 我也在提问中提到过。 我第一次尝试失败,然后我发现我有一个错误命名.env文件; 这是.evn

我尝试使用.env文件,如下所述:

 cat .env REP_USER=myusername REP_PASS=mypassword 

然后我调用docker-compose config返回:

 networks: {} services: ui: build: args: REP_PASS: mypassword REP_USER: myusername context: /home/zeinab/Workspace/ZiZi-Docker/Test/test-exec-1 dockerfile: Dockerfile version: '2.0' volumes: {} 

这意味着这解决了我的问题。 我应该提到这个答案真的很有帮助。