因此,我试图让我们的公司采用Docker发布工作流程,因此我必须使用docker和我希望合并的所有技术来制作项目。
我已经创建了一个Dockerfile来构建我们的VM环境,除了最后几步之外,一切正常。
当我为项目构建图像时,我的机器上有一个带有标准化docker LEMP堆栈的文件夹,它在我的/ documents / kitematic / image_name中创建了一个新安装的卷,这是我们将初始化git的地方回购。
因为这个原因我想使用COPY或添加将所有dockerfiles复制到新的Docker卷中,因此它包含在git repo中以跟踪更改,以及devs更容易克隆repo构建并继续。
Dockerfile的最后一部分是
# Create Mounted Folders
RUN mkdir /$SMACK_APP_VOL_DIR && \
mkdir /$SMACK_APP_VOL_DIR/www && \
mkdir /$SMACK_APP_VOL_DIR/docker_stack
# set owners of web folders before mounting
RUN usermod -u 1000 www-data
# set folder groups
RUN chown -Rf www-data:www-data /$SMACK_APP_VOL_DIR
# Mount folders
VOLUME ["/$SMACK_APP_VOL_DIR/www","/$SMACK_APP_VOL_DIR/docker_stack/"]
# Expose Ports
EXPOSE 443
EXPOSE 80
# Add git commands to allow container updating
ADD ./docker_stack/pull /usr/bin/pull
ADD ./docker_stack/push /usr/bin/push
RUN chmod 755 /usr/bin/pull && chmod 755 /usr/bin/push
# Supervisor Config
ADD ./docker_stack/confs/supervisord.conf /etc/supervisord.conf
# Start Supervisord
ADD ./docker_stack/start.sh /start.sh
# nginx site conf
RUN rm -Rf /etc/nginx/sites-available/*
ADD ./docker_stack/confs/default.conf /etc/nginx/sites-available/
# Copy docker project to folder for inclusion to GIT repo
ADD ./docker_stack/ /mounted/docker_stack
CMD ["/bin/bash", "/start.sh"]
所以我的本地文件夹中的docker_stack是docker文件的位置,我最初使用env var $ SMACK_APP_VOL_DIR来添加和读取有envs和ADD / COPY问题的人,因此硬编码了mount路径。它仍然没有移动docker_stack目录,但如果我这样做
ADD ./docker_stack/ /home
它会将其复制到/ home目录但如果我尝试将/ home添加到VOLUME,则文件不会显示在我的本地计算机中。
任何帮助非常感谢
答案 0 :(得分:8)
您需要将VOLUME
指令移到最终ADD
指令之下(我建议在CMD
指令之上) - 一旦将目录定义为VOLUME
,它本质上是"快照"此时,为每个额外的容器/图层创建了空白和新鲜,因此在该点之后添加的任何文件都将被隐藏/忽略。
还值得注意的是,您不需要在VOLUME
中明确定义Dockerfile
,以便使用-v
的绑定装载形式在运行时,所以您可能根本不需要在docker_stack
的{{1}}中拥有VOLUME
目录。