2016-07-18 3 views
13

docker build 동안 빌드 인수를 필수로 만들 수있는 방법이 있습니까? 예상 된 동작은 인수가없는 경우 빌드가 실패하는 것입니다. 다음 Dockerfile에 대한 예를 들어Docker 빌드시 빌드 인수를 필수로 만드는 방법은 무엇입니까?

: 나는 docker build -t my-tag .로 구축 할 때 ARG MY_VARIABLE에 실패하고 docker build -t my-tag --build-arg MY_VARIABLE=my_value .로 구축 할 때 전달하는 빌드를 원하는

FROM ubuntu 

ARG MY_VARIABLE 
ENV MY_VARIABLE $MY_VARIABLE 

RUN ... 

.

해당 동작을 수행 할 수있는 방법이 있습니까? 필자의 경우 기본값을 설정해도 실제로 트릭을 수행하지는 않습니다.

(. 내가 darwin/amd64에 도커 1.11.1을 실행하는거야)

편집 : 나는 MY_VARIABLE가 비어있을 때 실패 명령, 예를 들어, 실행하는 것입니다 생각할 수있는 일을 한 가지 방법 :

FROM ubuntu 

ARG MY_VARIABLE 
RUN test -n "$MY_VARIABLE" 
ENV MY_VARIABLE $MY_VARIABLE 

RUN ... 

하지만이 문제에 대한 매우 관용적 인 해결책은 아닌 것 같습니다. 당신은 이런 일을 할 수

+0

arg가 전달되지 않으면 실패합니다 약간 이상한 것입니다 정의되지 않은 하지만 다른 방법은 아니지만, 그것이 작동하는 방식 인 것 같습니다. dockerfile에서 "test.sh"스크립트를 실행하여 단계의 범위를 확인하고 적절히 처리 할 수 ​​있습니다. 복잡성에 따라 별도의 파일로 관리하는 것이 더 쉬울 수도 있습니다. 단지 하나 또는 두 개의 ARG 일 경우 인라인 방법이 실제로 최고 일 수 있습니다. – ldg

답변

6

...

FROM ubuntu:14.04 
ONBUILD ARG MY_VARIABLE 
ONBUILD RUN if [ -z "$MY_VARIABLE" ]; then echo "NOT SET - ERROR"; exit 1; else : ; fi 

그런 docker build -t my_variable_base .

그리고 그것은 슈퍼 깨끗한 아니다

FROM my_variable_base 
... 

이에 따라 이미지를 ... 구축, 하지만 적어도 "bleh"자료는 기본 이미지로 추상화됩니다.

+0

'ONBUID'를 사용할 때 그것은 제거 할 때만 작동하지 않습니다. –

6

"RUN test -n"으로 테스트했는데 원래의 (편집) 게시물에 언급 된 @konradstrack ... docker 빌드 명령의 빌드 시간 인수로 전달할 변수를 지정하는 것 같습니다

FROM ubuntu 

ARG MY_VARIABLE 
RUN test -n "$MY_VARIABLE" 
ENV MY_VARIABLE $MY_VARIABLE 
+0

좋은 답변입니다. 테스트는 간단하며 실패 할 때 충분한 컨텍스트를 제공합니다. – Subfuzion

3

shell parameter expansion도 사용할 수 있습니다. , 당신은 또한을 사용하고자하는 것입니다 물론

FROM debian:stretch-slim 
MAINTAINER Evel Knievel <[email protected]> 

ARG MANDATORY_BUILD_ARGUMENT 

RUN \ 
# Check for mandatory build arguments 
    : "${MANDATORY_BUILD_ARGUMENT:?Build argument needs to be set and non-empty.}" \ 

# Install libraries 
&& apt-get update \ 
&& apt-get install -y \ 
     cowsay \ 
     fortune \ 

# Cleanup 
&& apt-get clean \ 
&& rm -rf \ 
     /var/lib/apt/lists/* \ 
     /var/tmp/* \ 
     /tmp/* \ 

CMD ["/bin/bash", "-c", "/usr/games/fortune | /usr/games/cowsay"] 

:

의 당신의 필수 빌드 인수가 MANDATORY_BUILD_ARGUMENT라고 가정 해 봅시다, 당신은 당신의 Dockerfile은 다음과 같이 수, 비어 있지 않은 설정하고 싶은 빌드 - 인수, 내가했던 것처럼,하지만 여전히, 나는이 Dockerfile 빌드 및 테스트 실행을 위해 권장합니다. :)

+1

아름다운 구문을위한 Upvoting – sleepycal

+0

고마워, 고마워. :) –

관련 문제