1

我有一个 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 内容?

我认为这是一个相当常见的场景,因此必须有一些“最佳实践”解决方案。谢谢。

4

1 回答 1

0

我也遇到过这个问题:在我的例子中,Docker 容器中有一个非 root 进程,这个进程需要访问从主机挂载的文件,所以我必须注意Docker 映像和主机中的UID/值GID.

恐怕没有好的决定。Docker 镜像确实是不可变的,因此您必须建立一些协议或使用第三方软件来控制构建和部署过程。

我也强烈建议您停止使用docker-compose并尝试使用SaltStack.

于 2016-09-11T20:58:34.537 回答