我被困在我的音量和ECS问题上。我想附加卷,以便我可以存储在那里,.env文件等,所以我不需要重新手动在每次部署。问题是,我设置它的方式不更新(或覆盖)文件,这些文件被推送到ECR。因此,如果我更改代码并将其推送到git,它会执行以下操作:
docker ps时,它会创建新的容器,并将图像推送到ECR (它会动态地为图像分配标记)但是,当我刷新浏览器或清除缓存后,代码更改都不会出现。
我正在将卷附加到位于我的应用程序所在的文件夹/var/www/html上,因此据我所知,在部署过程中应该替换这段代码。但问题是,它并没有取代代码。
当我删除卷时,每次部署完成时,我都可以看到代码更改,但我还必须手动创建.env文件+运行几个命令。
PS:我有另一个容器(mysql),它以完全相同的方式设置卷,即使在创建新容器之后,我在数据库中所做的更改也是持久的。
请查看我的Docker文件和taskDefinition.json,看看我如何处理卷。
Dockerfile:
FROM alpine:${ALPINE_VERSION}
# Setup document root
WORKDIR /var/www/html
# Install packages and remove default server definition
RUN apk add --no-cache \
curl \
nginx \
php8 \
php8-ctype \
php8-curl \
php8-dom \
php8-fpm \
php8-gd \
php8-intl \
php8-json \
php8-mbstring \
php8-mysqli \
php8-pdo \
php8-opcache \
php8-openssl \
php8-phar \
php8-session \
php8-xml \
php8-xmlreader \
php8-zlib \
php8-tokenizer \
php8-fileinfo \
php8-json \
php8-xml \
php8-xmlwriter \
php8-simplexml \
php8-dom \
php8-pdo_mysql \
php8-pdo_sqlite \
php8-tokenizer \
php8-pecl-redis \
php8-bcmath \
php8-exif \
supervisor \
nano \
sudo
# Create symlink so programs depending on `php` still function
RUN ln -s /usr/bin/php8 /usr/bin/php
# Configure nginx
COPY tools/docker/config/nginx.conf /etc/nginx/nginx.conf
# Configure PHP-FPM
COPY tools/docker/config/fpm-pool.conf /etc/php8/php-fpm.d/www.conf
COPY tools/docker/config/php.ini /etc/php8/conf.d/custom.ini
# Configure supervisord
COPY tools/docker/config/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
# Make sure files/folders needed by the processes are accessable when they run under the nobody user
RUN chown -R nobody.nobody /var/www/html /run /var/lib/nginx /var/log/nginx
# Install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN apk update && apk add bash
# Install node npm
RUN apk add --update nodejs npm \
&& npm config set --global loglevel warn \
&& npm install --global marked \
&& npm install --global node-gyp \
&& npm install --global yarn \
# Install node-sass's linux bindings
&& npm rebuild node-sass
# Switch to use a non-root user from here on
USER nobody
# Add application
COPY --chown=nobody ./ /var/www/html/
RUN cat /var/www/html/resources/js/Components/Sections/About.vue
RUN composer install --optimize-autoloader --no-interaction --no-progress --ignore-platform-req=ext-zip --ignore-platform-req=ext-zip
USER root
RUN yarn && yarn run production
USER nobody
VOLUME /var/www/html
# Expose the port nginx is reachable on
EXPOSE 8080
# Let supervisord start nginx & php-fpm
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]
# Configure a healthcheck to validate that everything is up&running
HEALTHCHECK --timeout=10s CMD curl --silent --fail http://127.0.0.1:8080/fpm-pingtaskDefinition.json
{
"containerDefinitions": [
{
"name": "fooweb-nginx-php",
"cpu": 100,
"memory": 512,
"links": [
"mysql"
],
"portMappings": [
{
"containerPort": 8080,
"hostPort": 80,
"protocol": "tcp"
}
],
"essential": true,
"environment": [],
"mountPoints": [
{
"sourceVolume": "fooweb-storage-web",
"containerPath": "/var/www/html"
}
]
},
{
"name": "mysql",
"image": "mysql",
"cpu": 50,
"memory": 512,
"portMappings": [
{
"containerPort": 3306,
"hostPort": 4306,
"protocol": "tcp"
}
],
"essential": true,
"environment": [
{
"name": "MYSQL_DATABASE",
"value": "123"
},
{
"name": "MYSQL_PASSWORD",
"value": "123"
},
{
"name": "MYSQL_USER",
"value": "123"
},
{
"name": "MYSQL_ROOT_PASSWORD",
"value": "123"
}
],
"mountPoints": [
{
"sourceVolume": "fooweb-storage-mysql",
"containerPath": "/var/lib/mysql"
}
]
}
],
"family": "art_web_task_definition",
"taskRoleArn": "arn:aws:iam::123:role/ecs-task-execution-role",
"executionRoleArn": "arn:aws:iam::123:role/ecs-task-execution-role",
"networkMode": "bridge",
"volumes": [
{
"name": "fooweb-storage-mysql",
"dockerVolumeConfiguration": {
"scope": "shared",
"autoprovision": true,
"driver": "local"
}
},
{
"name": "fooweb-storage-web",
"dockerVolumeConfiguration": {
"scope": "shared",
"autoprovision": true,
"driver": "local"
}
}
],
"placementConstraints": [],
"requiresCompatibilities": [
"EC2"
],
"cpu": "1536",
"memory": "1536",
"tags": []
}所以我相信我设定音量的方式会有一些问题,或者可能会有一些许可问题?
非常感谢!
发布于 2022-03-16 12:02:49
“我将卷附加到/var/www/html文件夹中,因此根据我的理解,在部署过程中应该替换这段代码。
这与码头容量的工作原理正好相反。
它将忽略码头映像中的/var/www/html中的任何内容,而是重用您在挂载的卷中拥有的任何内容。挂载卷主要用于在容器重新启动和图像更改之间持久化文件。如果正在构建的映像中的/var/www/html中有更新的代码,并且希望在部署应用程序时该更新代码处于活动状态,则不能将其作为卷挂载。
如果您要在您的VOLUME中指定Dockerfile指令,那么在容器中第一次运行容器时,它将使用停靠器容器中的文件“初始化”卷,作为创建卷过程的一部分。之后,主机服务器上卷中的文件将在容器重新启动/部署过程中持久化,并且忽略了对新码头映像中该路径的任何新更新。
https://stackoverflow.com/questions/71490121
复制相似问题