2015-03-04 4 views
4

У меня есть приватный репозиторий git на github.com, и я хочу автоматизировать процесс docker build, используя Dockerfile. Я наивно думал, что лучшее место, чтобы Dockerfile находится в корневой папке моего репо. Пример:docker run с ENTRYPOINT, содержащим переменную

git clone ssh://[email protected]/avilella/bioboxes_playground 
cd bioboxes_playground 
ls Dockerfile 
Dockerfile 

Так файлы в папке репо являются:

[hpenvy15 bioboxes_playground] $ tree -Difts 
. 
[  18027 Mar 3 14:58] ./LICENSE 
[   22 Mar 3 14:58] ./README.md 
[  825 Mar 4 11:59] ./Dockerfile 
[  4096 Mar 4 11:59] ./src 
[   74 Mar 4 11:59] ./src/hello_world.c 

Таким образом, для внешних зависимостей, я устанавливаю их apt-get install или загружая tar.gz и установить их во время docker build.

я узнал из предыдущего вопроса, как добавить локальные файлы в образ (так называемый «контекст» в Dockerfile): http://kimh.github.io/blog/en/docker/gotchas-in-writing-dockerfile-en/#add_and_understanding_context_in_dockerfile

я добавил простой src/hello_world.c пример, который в репо, и я хочу компилировать во время docker build. Смотрите ниже:

EDITED: добавлена ​​WORKDIR Теперь

FROM debian:wheezy 
MAINTAINER Foo Bar, [email protected] 

ENV ORG foo 
ENV APP bar 
ENV INSTALL_DIR /opt/${ORG}/${APP} 

ENV PACKAGES wget binutils make csh g++ sed gawk perl zlib1g-dev 
RUN apt-get update -y && apt-get install -y --no-install-recommends ${PACKAGES} 

ENV SEQTK https://github.com/avilella/seqtk/archive/sgdp.tar.gz 

ENV THIRDPARTY_DIR ${INSTALL_DIR}/thirdparty 

RUN mkdir -p ${THIRDPARTY_DIR} 
RUN cd ${THIRDPARTY_DIR} 

# SEQTK 

RUN mkdir -p ${THIRDPARTY_DIR}/seqtk && cd ${THIRDPARTY_DIR}/seqtk &&\ 
    wget --quiet --no-check-certificate ${SEQTK} --output-document - |\ 
    tar xzf - --directory . --strip-components=1 && \ 
    make 

# COMPILE HELLO_WORLD 

ADD src/hello_world.c ${INSTALL_DIR}/hello_world.c 

RUN gcc ${INSTALL_DIR}/hello_world.c -o ${INSTALL_DIR}/hello_world 

WORKDIR ${INSTALL_DIR} 
ENTRYPOINT ["./hello_world"] 

Моя проблема в настоящее время является то, что мой определенный ENTRYPOINT не работает, потому что INSTALL_DIR является переменной ENV. Я могу жестко закодировать его /opt/foo/bar/hello_world, а затем он работает:

$ sudo docker run -i foo                                 
exec: "./hello_world": stat ./hello_world: no such file or directory2015/03/04 15:43:37 Error response from daemon: Cannot start container cd39493be9f40a8714cbc1e503a1f172e2e5dc485881d0b5e34322fbb2f71380: exec: "./hello_world": stat ./hello_world: no such file or directory 

Это работает:

$ sudo docker run --entrypoint='/opt/foo/bar/hello_world' -i foo                       
Hello World 

Любые идеи, как сделать работу Entrypoint в моем примере?

ответ

3

ENTRYPOINT не делает замену ENV, но WORKDIR does:

WORKDIR ${INSTALL_DIR} 
ENTRYPOINT ./hello_world 

Но мне интересно, почему вы хотите иметь INSTALL_DIR как переменную? Если вы не используете контейнеры, вы сделаете это так, чтобы /opt/foo/bar и /opt/foo/baz и /opt/qux/bar могли сосуществовать. Но если каждый из них находится в отдельном контейнере, то все они могут жить по адресу /opt/app.

+0

Возможно, ему нравится то, что он может определить установочный каталог by orgname и appname. Помимо этого, изменение этих варов означало бы, что весь файл докеров будет восстановлен (все кэши недействительны). Не кажется очень полезным. – RoyB

+0

Я вижу. Теперь я обновил его до последних двух строк, которые были в вашем примере, но он по-прежнему не работает для меня. Жестко закодировано. – 719016

+0

Вы используете форму JSON, но я написал свой пример в не-JSON, потому что я полагаюсь на оболочку, чтобы использовать относительный путь. Вы можете сказать 'ENTRYPOINT ["/bin/bash "," ./ hello_world "]', и я думаю, что это будет одинаково. –