我有一个码头构成新手问题。我们有一个现有的Jenkins构建,可以创建Docker镜像并将它们推送到内部Artifactory存储库。这是通过使用Maven / Docker和两个Dockerfiles驱动的,一个用于app,一个用于卷/数据容器。 Dockerfiles看起来像这样:
应用:
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" ]
为了简洁起见,我省略了标签之类的东西。因此,来自这些Dockerfiles的构建生成的图像将最终出现在本地Artifactory仓库中。我们正在使用Rancher / Cattle来实例化这些图像,并且我已将Artifactory repo添加到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),但我对事情的运作方式感到困惑。我的理解是,当我运行docker build时,Dockerfile中的命令会被执行,之后,图像是不可变的。当我基于图像实例化一个容器时,如果我已经正确理解了它,它会在它上面创建一个新的可写UFS层。所以在数据容器的情况下,我一旦创建它就无法真正改变它,对吧?如果这个假设是正确的,那么归结为1)我如何在两个不同的系统中最佳地同步用户ID(Maven用于创建Docker镜像,Rancher用于实例化容器群集),以及2)是否更好地驱动创建数据卷容器完全来自docker-compose.yml?那么我怎样才能在docker-compose.yml中复制数据容器的Dockerfile内容?
我认为这是一个相当普遍的情况,因此必须有一些“最佳实践”解决方案。谢谢。
答案 0 :(得分:0)
我也遇到过这个问题:在我的情况下,Docker容器中有一个非root进程,这个进程需要访问从主机挂载的文件,所以我不得不关注{{1在Docker镜像和主机中都有/ UID
值。
我担心没有好的决定。 Docker镜像确实是不可变的,因此您必须建立一些协议或使用第三方软件来控制构建和部署过程。
我还强烈建议您停止使用GID
并尝试docker-compose
。