2015-12-16 14 views
11

Docker 1.9 pozwala przekazywać argumenty do pliku docker. Zobacz link: https://docs.docker.com/engine/reference/builder/#argJak przekazać wartość ARG do ENTRYPOINT?

Jak mogę przekazać te same elementy w ramach instrukcji ENTRYPOINT?

Moja dockerfile ma

Arg $ version = 3,1
punkt_wejścia /tmp/folder-$Version/sample.sh rozpocznie

Otrzymuję błąd podczas tworzenia pojemnik z powyższym dockerfile . Proszę zasugerować jaki jest prawidłowy sposób podania argumentu w instrukcji ENTRYPOINT?

+0

więc poprosić o opcji, na przykład, '--entrypoint =/root/run.sh'? – BMW

Odpowiedz

0

Ponieważ używasz zmiennej wewnątrz większej ekspresji, to może skorzystać z bycia otoczonym przez nawiasy brakets:

ENTRYPOINT /tmp/folder-${Version}/sample.sh start 
2

Składnia ARG należy pominąć $.

Zamiast ARG $Version=3.1, spróbuj ARG Version=3.1.

6

Krótka odpowiedź: trzeba użyć ENV

Zarówno ARG i ENV nie są rozszerzane w ENTRYPOINT lub CMD. (https://docs.docker.com/engine/reference/builder/#environment-replacement) Jednak ponieważ ENV s są przekazywane jako część środowiska, są one dostępne w czasie wykonywania, więc powłoka może je rozwinąć. (Oznacza to, że nie może skorzystać z formularza tablicę ENTRYPOINT lub CMD.)

Oto przykład:

$ cat arg/Dockerfile 
FROM debian:jessie 
ARG FOO=bar 
ENTRYPOINT echo ${FOO:-foo} 
$ sudo docker build arg 
Sending build context to Docker daemon 2.048 kB 
Step 1 : FROM debian:jessie 
---> f50f9524513f 
Step 2 : ARG FOO=bar 
---> Using cache 
---> 2cfdcb514b62 
Step 3 : ENTRYPOINT echo ${FOO:-foo} 
---> Running in 21fb9b42c10d 
---> 75e5018bad83 
Removing intermediate container 21fb9b42c10d 
Successfully built 75e5018bad83 
$ sudo docker run 75e5018bad83 
foo 
$ sudo docker run -e FOO=bas 75e5018bad83 
bas 
$ sudo docker build --build-arg FOO=bas arg 
Sending build context to Docker daemon 2.048 kB 
Step 1 : FROM debian:jessie 
---> f50f9524513f 
Step 2 : ARG FOO=bar 
---> Using cache 
---> 2cfdcb514b62 
Step 3 : ENTRYPOINT echo ${FOO:-foo} 
---> Using cache 
---> 75e5018bad83 
Successfully built 75e5018bad83 
$ sudo docker run 75e5018bad83 
foo 
$ cat env/Dockerfile 
FROM debian:jessie 
ARG FOO=bar 
ENV FOO=${FOO} 
ENTRYPOINT echo ${FOO:-foo} 
$ sudo docker build env 
Sending build context to Docker daemon 2.048 kB 
Step 1 : FROM debian:jessie 
---> f50f9524513f 
Step 2 : ARG FOO=bar 
---> Using cache 
---> 2cfdcb514b62 
Step 3 : ENV FOO ${FOO} 
---> Running in f157a07c1b3e 
---> a5e8c5b65a17 
Removing intermediate container f157a07c1b3e 
Step 4 : ENTRYPOINT echo ${FOO:-foo} 
---> Running in 66e9800ef403 
---> 249fe326e9ce 
Removing intermediate container 66e9800ef403 
Successfully built 249fe326e9ce 
$ sudo docker run 249fe326e9ce 
bar 
$ sudo docker run -e FOO=bas 249fe326e9ce 
bas 
$ sudo docker build --build-arg FOO=bas env 
Sending build context to Docker daemon 2.048 kB 
Step 1 : FROM debian:jessie 
---> f50f9524513f 
Step 2 : ARG FOO=bar 
---> Using cache 
---> 2cfdcb514b62 
Step 3 : ENV FOO ${FOO} 
---> Running in 6baf31684b9f 
---> 8f77ad154798 
Removing intermediate container 6baf31684b9f 
Step 4 : ENTRYPOINT echo ${FOO:-foo} 
---> Running in 892ac47cabed 
---> fa97da85bf8a 
Removing intermediate container 892ac47cabed 
Successfully built fa97da85bf8a 
$ sudo docker run fa97da85bf8a 
bas 
$ 
+0

Dlaczego zmienne środowiskowe są dostępne w czasie wykonywania? Czy "proces uruchamiania" jest procesem podrzędnym procesu budowy? –

1

Jak Blake Mitchell NOK, nie można używać ARG w ENTRYPOINT. Jednakże można użyć ARG jako wartość dla ENV, w ten sposób można go używać z ENTRYPOINT:

Dockerfile

ARG my_arg 
ENV my_env=$my_arg 

ENTRYPOINT echo $my_env 
Powiązane problemy