2016-12-02 61 views
0

我通過運行命令docker-compose build來調用docker文件,通過我的docker撰寫文件。我在.env文件中定義了我的環境變量。當我這樣做的身材,在我的搬運工文件,一切正常,除了這行將環境變量傳遞到通過撰寫yaml構建的docker文件

RUN git config --global user.email ${USER_NAME} 

它失敗的消息

←[31mERROR←[0m: Service 'git' failed to build: The command '/bin/sh -c git confi 
g --global user.email ${USER_NAME}' returned a non-zero code: 1 

但是,如果我贊同集裝箱時$ {USER_NAME}(泊塢窗,撰寫它可以正確打印出這個變量。

ENTRYPOINT echo ${USER_NAME}//this works 

什麼是在一個環境變量傳遞在泊塢窗文件運行命令的正確方法?

更新:這是文件的精簡版

YAML文件

version: '2' 
services: 
    git: 
     build: 
      context: ./git 
      args: 
      - USER_NAME 
     env_file: 
     - ./common.env 

信封文件

USER_NAME="My test user" 

泊塢文件:

FROM xxx 

ARG USER_NAME 

RUN git config --global user.name ${USER_NAME} 
ENTRYPOINT git config --list 

命令 體形:

docker-compose build git 

運行:

docker-compose up git 

構建失敗,錯誤

RUN git config --global user.name ${USER_NAME} 
---> Running in 7b67ddeae989 
←[31mERROR←[0m: Service 'git' failed to build: The command '/bin/sh -c git config --global user.name ${USER_NAME}' returned a non-zero code: 1 
+0

包含一個更完整的docker-compose.yml和Dockerfile示例可以更容易地提供幫助。 – BMitch

+0

您的'git'命令失敗了,從提供的有限錯誤信息中,無法說明原因(是否安裝了git)?嘗試直接在容器中運行它,並確保它不會提示輸入或提供不良的退出代碼。您的'.env'文件內容也可能有助於調試。 – BMitch

+0

添加了.env內容。如果我硬編碼它的用戶名。在運行時直接讀取環境也可以。 – developer747

回答

0
ENV USER_NAME developer747 
RUN git config --global user.email ${USER_NAME} 

參考:Environment replacement¶

+0

但我希望它從.env文件讀取此環境。如果我在入口處閱讀它,這將起作用。在您發佈的示例中,它正在docker文件中進行硬編碼,而不是從文件中讀取。 – developer747

2

的.ENV AP使用docker-compose.yml。假設你是從你撰寫內部建立一個Dockerfile(如docker-compose build),那麼你可以通過從撰寫ARG到構建,爲構建RUN提供這個變量:

泊塢窗,compose.yml:

... 
build: 
    args: 
    USER_NAME: ${USER_NAME} 

Dockerfile:

... 
ARG USER_NAME=developer747 
RUN git config --global user.email ${USER_NAME} 

下面是這在我的實驗室的例子:

$ cat docker-compose.build-arg.yml 
version: '2' 

services: 
    build-test: 
    build: 
     args: 
     USER_NAME: ${USER_NAME} 
     context: . 
     dockerfile: df.build-arg 
    image: test-build-args 

$ cat .env 
ENV=default 
USER_NAME=test2 

$ cat df.build-arg 
FROM busybox 

ARG USER_NAME=default 
RUN adduser --disabled-password ${USER_NAME} 
CMD tail -f /dev/null 

$ docker-compose -f docker-compose.build-arg.yml up --build -d 
Building build-test 
Step 1 : FROM busybox 
---> 2b8fd9751c4c 
Step 2 : ARG USER_NAME=default 
---> Using cache 
---> 9be5b562c784 
Step 3 : RUN adduser --disabled-password ${USER_NAME} 
---> Using cache 
---> bcbaf683e3cf 
Step 4 : CMD tail -f /dev/null 
---> Running in 66908e4f7a0c 
---> 06b9774253c2 
Removing intermediate container 66908e4f7a0c 
Successfully built 06b9774253c2 
Recreating test_build-test_1 

$ docker exec -it test_build-test_1 /bin/sh 
/# tail /etc/passwd 
root:x:0:0:root:/root:/bin/sh 
daemon:x:1:1:daemon:/usr/sbin:/bin/false 
bin:x:2:2:bin:/bin:/bin/false 
sys:x:3:3:sys:/dev:/bin/false 
sync:x:4:100:sync:/bin:/bin/sync 
mail:x:8:8:mail:/var/spool/mail:/bin/false 
www-data:x:33:33:www-data:/var/www:/bin/false 
operator:x:37:37:Operator:/var:/bin/false 
nobody:x:99:99:nobody:/home:/bin/false 
test2:x:1000:1000:Linux User,,,:/home/test2:/bin/sh 
/# exit 
+0

我不想在docker文件中硬編碼值developer747。它應該來自.env文件。 – developer747

+0

那裏沒有硬編碼,如果在Docker構建過程中無法傳遞arg,則Dockerfile中的值是默認值。選擇一個合理的默認值,這對您的圖像有意義。 – BMitch

+0

我試過了。它選擇了開發者價值747。它沒有選擇.env文件中的內容。顯然,在構建時間和運行時間期間有不同的方式來獲取環境變量。我會多玩一點。 – developer747

相關問題