我有一个 docker-compose 新手问题。我们有一个现有的 Jenkins 构建,它创建 Docker 映像并将它们推送到内部 Artifactory 存储库。这是通过使用 Maven/Docker 和两个 Dockerfile 驱动的,一个用于应用程序,一个用于卷/数据容器。Dockerfile 看起来像这样:
应用程序:
FROM centos
RUN useradd -u 6666 -ms /bin/bash foouser
COPY src/main/resources/home/foouser/.bashrc /home/foouser/
RUN chown -R foouser:foouser /home/foouser
USER foouser
COPY src/main/resources/opt/myapp/bin/startup.sh /opt/myapp/bin/
WORKDIR /home/foouser
ENTRYPOINT /opt/myapp/bin/startup.sh && /bin/bash
数据容器:
FROM centos
# Environment variable for the path to mount/create. Defaults to /opt/data
ENV DATA_VOL_PATH="/opt/data"
# Make sure the user id is the same as the container using the volume, otherwise we may run into permission issues on
# the container mounting the volume.
RUN useradd -u 6666 -ms /bin/bash foouser && \
mkdir -p "$DATA_VOL_PATH" && \
chown -R foouser:foouser "$DATA_VOL_PATH"
VOLUME [ "$DATA_VOL_PATH" ]
为简洁起见,我省略了标签等内容。因此,从这些 Dockerfile 构建生成的图像最终将保存在本地 Artifactory 存储库中。我们正在使用 Rancher/Cattle 来实例化这些图像,并且我已将 Artifactory 存储库添加到 Rancher,以便它可以从那里提取。Rancher 中的 docker-compose.yml 文件如下所示:
# The data/volumes container for the data.
data:
image: data-image
# App
myapp:
image: app-image
environment:
DATA_VOL_PATH:
volumes_from:
- data
我知道我可以从 docker-compose 传递环境变量(如上面的 DATA_VOL_PATH ),但我对事情的工作方式感到困惑。我的理解是Dockerfile中的命令是在我运行docker build的时候执行的,之后镜像是不可变的。当我基于图像实例化一个容器时,如果我理解正确的话,它会在它之上创建一个新的可写 UFS 层。所以在数据容器的情况下,一旦创建卷,我就不能真正改变它,对吧?如果这个假设是正确的,它可以归结为 1)我如何最好地在两个不同的系统(Maven 用于创建 Docker 映像,Rancher 用于实例化容器集群)之间同步用户 ID,以及 2)驱动创建数据卷容器完全来自 docker-compose。yml?那么我如何能够在 docker-compose.yml 中复制数据容器的 Dockerfile 内容?
我认为这是一个相当常见的场景,因此必须有一些“最佳实践”解决方案。谢谢。