Dockerfile中的CMD命令在容器启动时未运行

16

我已经为一个项目编写了Dockerfile,定义了一个CMD来在启动容器时运行并引导应用程序。

Dockerfile如下:

# create our mount folders and volumes
ENV MOUNTED_VOLUME_DIR=sites
RUN mkdir /$MOUNTED_VOLUME_DIR
ENV PATH=$MOUNTED_VOLUME_DIR/sbin:$MOUNTED_VOLUME_DIR/common/bin:$PATH
RUN chown -Rf www-data:www-data /$MOUNTED_VOLUME_DIR

# Mount folders
VOLUME ["/$MOUNTED_VOLUME_DIR/"]

# Expose Ports
EXPOSE 443

# add our environment variables to the server
ADD ./env /env

# Add entry point script
ADD ./start.sh /usr/bin/startContainer
RUN chmod 755 /usr/bin/startContainer

# define entrypoint command
CMD ["/bin/bash", "/usr/bin/startContainer"]

start.sh脚本会执行一些git操作,如克隆正确的仓库、设置环境变量以及启动supervisor。

该start脚本从这里开始执行。

#!/bin/bash

now=$(date +"%T")
echo "Container Start Time : $now" >> /tmp/start.txt
/usr/bin/supervisord -n -c /etc/supervisord.conf

我这样启动我的新容器
docker run -d -p expoPort:contPort -t -i -v /$MOUNTED_VOLUME_DIR/$PROJECT:/$MOUNTED_VOLUME_DIR $CONTAINER_ID /bin/bash

当我登录容器时,发现supervisor、nginx和php5-fpm都没有启动。/tmp/start.txt文件不存在,其中包含了从startContainer脚本设置的时间戳,这表明Dockerfile中的CMD从未运行过。
请问如何解决这个问题?

4
您在运行docker run命令时,将CMD替换为/bin/bash,因此您的启动脚本未运行是“正常”的。 - user2915097
1个回答

30

This:

docker run -d -p expoPort:contPort -t -i -v /$MOUNTED_VOLUME_DIR/$PROJECT:/$MOUNTED_VOLUME_DIR $CONTAINER_ID /bin/bash

在实例化容器后,输入“run /bin/bash”。例如,跳过CMD
尝试这个:
docker run -d -p expoPort:contPort -t -i -v /$MOUNTED_VOLUME_DIR/$PROJECT:/$MOUNTED_VOLUME_DIR $CONTAINER_ID 

谢谢,没错。我以为你仍然需要将 bash 传递到启动容器中。 - James Kirkby
这是一种方便的方式来覆盖默认设置。在运行启动脚本之前,先使用 bash 运行脚本、检查配置等,然后作为守护进程运行。 - Sobrique

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接