Как передать значение ARG для ENTRYPOINT?
Docker 1.9 позволяет передавать аргументы в файл докеров. См. Ссылку: https://docs.docker.com/engine/reference/builder/#arg
Как я могу передавать те же самые исправления в инструкции ENTRYPOINT?
Мой файл dockerfile имеет
ARG $Version = 3.1
ENTRYPOINT/tmp/folder-$Version/sample.sh start
Я получаю сообщение об ошибке при создании контейнера с указанным выше файлом docker.
Пожалуйста, представьте, какой правильный способ указать аргумент в инструкции ENTRYPOINT
Ответы
Ответ 1
Как и Блейк Митчелл, вы не можете использовать ARG
в ENTRYPOINT
. Однако вы можете использовать ARG
в качестве значения для ENV
, таким образом вы можете использовать его с ENTRYPOINT
:
Dockerfile
ARG my_arg
ENV my_env_var=$my_arg
ENTRYPOINT echo $my_env_var
и запустить:
docker build --build-arg "my_arg=foo" ...
Ответ 2
Короткий ответ: вам нужно использовать ENV
Оба ARG
и ENV
не расширены в ENTRYPOINT
или CMD
. (https://docs.docker.com/engine/reference/builder/#environment-replacement) Однако, поскольку ENV
передаются как часть среды, они доступны во время выполнения, поэтому оболочка может расширьте их. (Это означает, что вы не можете использовать форму массива ENTRYPOINT
или CMD
.)
Вот пример:
$ 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
$
Ответ 3
Синтаксис ARG
должен опускать $
.
Вместо ARG $Version=3.1
попробуйте ARG Version=3.1
.
Ответ 4
Поскольку вы используете переменную внутри большего выражения, это может быть полезно для окружения фигурных скобок:
ENTRYPOINT /tmp/folder-${Version}/sample.sh start