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: {}
这意味着这解决了我的问题。 我应该提到这个答案真的很有帮助。